PHP 5/Zend Engine 2.0的改进
近两年没有使用PHP写过程序了,今天要用PHP,就在网上查了查,看到了PHP5,一时之间兴趣又大了起来,于是翻译了这篇文章。
文章来源于http://www.php.net/。
新的对象模型
PHP中的对象处理部分已完全重写,具有更佳的性能和更多的功能。在先前的PHP版本中,对象被当做原始的简单类型
(如integer和string)来处理,这种方法的缺点是当变量被赋值或作为参数传递时,得到的是对象拷贝。而在新版本中,
对象是通过句柄来引用的,而不是通过对象的值(句柄想象为对象的标识符)。
很多PHP程序员可能未意识到老的对象模型的“copying quirks“,因此以前的大多数PHP程序将不需要做任何更改
即可运行,或只做很少的改动。
私有和保护成员
PHP 5引进了私有和保护成员变量,它们可以定义可视化的类属性。
示例
保护成员变量能在该类的子类中被访问,而私有成员变量只能在所属类中被访问。
Hello; print "MyClass::printHello() " . $this->Bar; print "MyClass::printHello() " . $this->Foo; }}class MyClass2 extends MyClass { protected $Foo; function printHello() { MyClass::printHello(); /* Should print */ print "MyClass2::printHello() " . $this->Hello; /* Shouldn't print out anything */ print "MyClass2::printHello() " . $this->Bar; /* Shouldn't print (not declared)*/ print "MyClass2::printHello() " . $this->Foo; /* Should print */ }}$obj = new MyClass();print $obj->Hello; /* 不输出任何内容,以下类同 */print $obj->Bar; /* Shouldn't print out anything */print $obj->Foo; /* Shouldn't print out anything */$obj->printHello(); /* Should print */$obj = new MyClass2();print $obj->Hello; /* Shouldn't print out anything */print $obj->Bar; /* Shouldn't print out anything */print $obj->Foo; /* Shouldn't print out anything */$obj->printHello();?>
私有和保护方法
PHP 5(ZEND引擎2)中,私有方法和保护方法也被引入。
示例:
aPrivateMethod(); }}class Bar extends Foo { public function aPublicMethod() { echo "Bar::aPublicMethod() called.\n"; $this->aProtectedMethod(); }}$o = new Bar;$o->aPublicMethod();?>
以前代码中的用户自定义类或方法中虽然没有定义"public," "protected" 或 "private"等关键字,但无需修改即可运行。
抽象类和方法
PHP 5还引入了抽象类和方法。抽象方法只声明方法的”符号”,而不提供它的实现。一个包含抽象方法的类需要声明为”abstract”。
例如:
test();?>
抽象类不能实例化。
旧的代码中的用户自定义类或方法中虽未定义"abstract”关键字,但无需修改就可以运行。
接口(Interfaces)
ZEND引擎2.0引入了接口。一个类可以实现任意的接口列表。
例如:
旧的代码中的用户定义类或方法中虽然没有定义"interface”关键字,但无需修改就可以正常运行。
类类型提示(Class Type Hints)
在保留类无需定义类型的同时,PHP 5引入了类类型提示来声明,以期望把对象的类通过参数传递给一个方法。
例如:
a($b);$a->b($b);?>
这些类类型提示不是象一些需要类型定义的语言那样在编译中进行检查,而是在运行时进行检查。这就意味着:
is equivalent to:
这种语法只用于对象或类,不适用于内建(built-in)类型。
Final关键字(final)
PHP 5引入了“final”关键字以定义在子类中不能被覆盖的成员或方法。
例:
class Foo { final function bar() { // ... }}?>
以前所写代码中的用户自定义类或方法中虽未定义"final"关键字,但无需修改就可以运行了。
对象克隆(Object Cloning)
PHP 4在对象被复制时,用户不能判断运行那个拷贝构造函数。在复制时,PHP 4根据对象的属性
一位一位地复制一个同样的复制品。
每次都要建立一个完全一样的复制品并不总是我们想要的。一个很好的复制构造例子是,当有
一个代表一个GTK窗口的对象,它拥有该窗口的所有资源,当你建立一个拷贝时,你可能需要一
个新的窗口,它拥有原窗口的所有属性,但需要拥有新窗口的资源。另外一个例子是你有一个
对象引用了另外一个对象,当你复制父对象时,你希望建立那个引用对象的新实例,以使复制品有一个单独的拷贝。
对一个对象的拷贝通过调用对象的__clone()方法完成:
$copy_of_object = $object->__clone();
?>
当开发者请求建立一个对象的新的拷贝时,ZEND引擎会检查是否已经定义了__clone()方法。如果未定义
的话,它会调用一个默认的__clone()方法来复制该对象的所有属性。如果定义了该方法,该方法会负责
在拷贝中设置必要的属性。为使用方便,引擎会提供一个函数从源对象中导入所有的属性,这样它就可
以先得到一个具有值的源对象拷贝,然后只需要对需要改变的属性进行覆盖即可。
例:
class MyCloneable {
static $id = 0;
function MyCloneable() {
$this->id = self::$id++;
}
function __clone() {
$this->name = $that->name;
$this->address = "New York";
$this->id = self::$id++;
}
}
$obj = new MyCloneable();
$obj->name = "Hello";
$obj->address = "Tel-Aviv";
print $obj->id . "\n";
$obj = $obj->__clone();
print $obj->id . "\n";
print $obj->name . "\n";
print $obj->address . "\n";
?>
统一的构造方法
ZEND引擎允许开发者定义类的构造方法。具有构造方法的类在新建时会首先调用构造方法,构造
方法适用于在正式使用该类前进行的初始化。
在PHP4中,构造方法的名称与类名相同。由于在派生类中调用父类的作法比较普遍,因此导致在
PHP4中当类在一个大型的类继承中进行移动时,处理方式有点笨拙。当一个派生类被移动到一个不同
的父类中时,父类的构造方法名必然是不同的,这样的话派生类中的有关调用父类构造方法的语句需要改写。
PHP5引入了一个定义构造方法的标准方式,通过调用它们的__construct()来定义。
示例:
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
$obj = new BaseClass();
$obj = new SubClass();
?>
为向后兼容,当PHP5类不能找到__construct()方法时,会通过老的方法也就是类名
来查找构造方法。这意味着唯一可能产生兼容性问题的是在以前的代码中已经使用了
一个名为__construct()的方法名。
析构方法
定义析构方法是十分有用的。析构方法可以记录调试信息,关闭数据库连接,还有做其它的扫尾
工作。PHP4中并无此机制,尽管PHP已支持注册在请求结束时需要运行的函数。
PHP5引入了与其它面向对象语言如Java语言相似的析构方法:当最后一个该对象的引用被清除时,
系统将会在该对象从内存中释放前调用名为__destruct()的析构方法。
示例:
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "Destroying " . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
?>
和构造方法相似,引擎将不调用父类的析构方法,为调用该方法,你需要在子
类的析构方法中通过parent::__destruct()语句进行调用。
常量
PHP 5 引入了类常量(per-class constants)定义:
class Foo {
const constant = "constant";
}
echo "Foo::constant = " . Foo::constant . "\n";
?>
PHP5允许常量中包含表达式,但在编译时常量中的表达式将被计算,
因此常量不能在运行中改变它的值。
class Bar {
const a = 1const b = 1const c = a | b;
}
?>
以前代码中的用户自定义类或方法中虽然未定义"const”关键字,
但无需修改就可以运行。
异常(Exceptions)
PHP4中没异常处理,PHP5引入了与其它与语言相似的异常处理模型。
class MyExceptionFoo extends Exception {
function __construct($exception) {
parent::__construct($exception);
}
}
try {
throw new MyExceptionFoo("Hello");
} catch (MyExceptionFoo $exception) {
print $exception->getMessage();
}
?>
以前代码中的用户自定义类或方法中虽未定义'catch', 'throw' 和 'try'关键字,但无需修改
就可以运行。
函数返回对象值
在PHP4中,函数不可能返回对象的值并对返回的对象进行方法调用,随着Zend Engine 2
(ZEND引擎2)的出现,以下调用成为可能:
class Circle {
function draw() {
print "Circle\n";
}
}
class Square {
function draw() {
print "Square\n";
}
}
function ShapeFactoryMethod($shape) {
switch ($shape) {
case "Circle":
return new Circle();
case "Square":
return new Square();
}
}
ShapeFactoryMethod("Circle")->draw();
ShapeFactoryMethod("Square")->draw();
?>
静态类中的静态成员变量可初始化
例如:
class foo {
static $my_static = 5;
}
print foo::$my_static;
?>
静态方法(Static Methods)
PHP5引入了关键字'static'来定义一个静态方法,这样可以从对象外进行调用。
例如:
class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
?>
虚拟变量$this在被定义为静态(static)的方法中无效。
Instanceof
PHP5引入了 “instanceof“关键字来确定一个对象是否是某一个对象的实例,或某一个对象的派生,或使用了某一个接口。
示例:
class baseClass { }
$a = new baseClass;
if ($a instanceof basicClass) {
echo "Hello World";
}
?>
静态函数变量(Static function variables)
所有的静态变量现在在编译时进行处理,这允许开发者通过引用来指定静态变量。这个变化提高了效率但意味着不可能对静态变量进行间接引用。
函数中通过引用方式传递的参数允许有默认值
例如:
function my_function(&$var = null) {
if ($var === null) {
die("$var needs to have a value");
}
}
?>
__autoload()
在初始化一个未定义的类时,__autoload()拦截函数(interceptor function)将被自动调
用。类名将作为__autoload()拦截函数唯一参数传递给它。
例如:
function __autoload($className) {
include_once $className . ".php";
}
$object = new ClassName;
?>
方法和属性调用的重载
所有方法调用和属性访问都可以通用 __call(), __get() 和 __set()方法来重载。
例: __get() 和 __set()
class Setter {
public $n;
public $x = array("a" => 1, "b" => 2, "c" => 3);
function __get($nm) {
print "Getting [$nm]\n";
if (isset($this->x[$nm])) {
$r = $this->x[$nm];
print "Returning: $r\n";
return $r;
} else {
print "Nothing!\n";
}
}
function __set($nm, $val) {
print "Setting [$nm] to $val\n";
if (isset($this->x[$nm])) {
$this->x[$nm] = $val;
print "OK!\n";
} else {
print "Not OK!\n";
}
}
}
$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a++;
$foo->z++;
var_dump($foo);
?>
示例: __call()
class Caller {
var $x = array(1, 2, 3);
function __call($m, $a) {
print "Method $m called:\n";
var_dump($a);
return $this->x;
}
}
$foo = new Caller();
$a = $foo->test(1, "2", 3.4, true);
var_dump($a);
?>

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











많은 사용자들이 스마트 시계를 선택할 때 Huawei 브랜드를 선택하게 됩니다. 그 중 Huawei GT3pro와 GT4가 가장 인기 있는 선택입니다. 두 제품의 차이점을 궁금해하는 사용자가 많습니다. Huawei GT3pro와 GT4의 차이점은 무엇입니까? 1. 외관 GT4: 46mm와 41mm, 재질은 유리 거울 + 스테인레스 스틸 본체 + 고해상도 섬유 후면 쉘입니다. GT3pro: 46.6mm 및 42.9mm, 재질은 사파이어 유리 + 티타늄 본체/세라믹 본체 + 세라믹 백 쉘입니다. 2. 건강한 GT4: 최신 Huawei Truseen5.5+ 알고리즘을 사용하면 결과가 더 정확해집니다. GT3pro: ECG 심전도, 혈관 및 안전성 추가

클래스와 메소드의 개념과 인스턴스 클래스(Class): 동일한 속성과 메소드를 가진 객체의 컬렉션을 설명하는 데 사용됩니다. 컬렉션의 모든 개체에 공통적인 속성과 메서드를 정의합니다. 객체는 클래스의 인스턴스입니다. 메소드: 클래스에 정의된 함수입니다. 클래스 구성 메서드 __init__(): 클래스에는 클래스가 인스턴스화될 때 자동으로 호출되는 init()라는 특수 메서드(구성 메서드)가 있습니다. 인스턴스 변수: 클래스 선언에서 속성은 변수로 표시됩니다. 이러한 변수를 인스턴스 변수라고 합니다. 인스턴스화: 클래스의 특정 개체인 클래스의 인스턴스를 만듭니다. 상속: 즉, 파생 클래스(derivedclass)가 기본 클래스(baseclass)를 상속합니다.

함수는 특정 기능을 포함하는 재사용 가능한 코드 블록으로, 입력 매개변수를 받아들이고 특정 작업을 수행하며 결과를 반환하는 것이 목적입니다. 코드 재사용성과 유지 관리성을 향상시키는 코드입니다.

Windows 11에서 캡처 도구가 작동하지 않는 이유 문제의 근본 원인을 이해하면 올바른 솔루션을 찾는 데 도움이 될 수 있습니다. 캡처 도구가 제대로 작동하지 않는 주요 이유는 다음과 같습니다. 초점 도우미가 켜져 있습니다. 이렇게 하면 캡처 도구가 열리지 않습니다. 손상된 응용 프로그램: 캡처 도구가 실행 시 충돌하는 경우 응용 프로그램이 손상되었을 수 있습니다. 오래된 그래픽 드라이버: 호환되지 않는 드라이버가 캡처 도구를 방해할 수 있습니다. 다른 응용 프로그램의 간섭: 실행 중인 다른 응용 프로그램이 캡처 도구와 충돌할 수 있습니다. 인증서가 만료되었습니다. 업그레이드 프로세스 중 오류로 인해 이 문제가 발생할 수 있습니다. 이 문제는 대부분의 사용자에게 적합하며 특별한 기술 지식이 필요하지 않습니다. 1. Windows 및 Microsoft Store 앱 업데이트

클래스는 클래스를 정의하는 데 사용되는 키워드입니다. 클래스 뒤에 공백을 추가하고 클래스 이름을 추가합니다. 규칙: 첫 글자가 여러 개인 경우 카멜 표기법을 사용합니다. [class Dog()]와 같은 이름 지정.

jQuery는 웹 개발에 널리 사용되는 클래식 JavaScript 라이브러리로, 이벤트 처리, DOM 요소 조작, 웹 페이지에서 애니메이션 수행과 같은 작업을 단순화합니다. jQuery를 사용할 때 요소의 클래스 이름을 바꿔야 하는 상황이 자주 발생합니다. 이 기사에서는 몇 가지 실용적인 방법과 구체적인 코드 예제를 소개합니다. 1. RemoveClass() 및 addClass() 메소드 사용 jQuery는 삭제를 위한 RemoveClass() 메소드를 제공합니다.

1부: 초기 문제 해결 단계 Apple 시스템 상태 확인: 복잡한 솔루션을 살펴보기 전에 기본 사항부터 시작해 보겠습니다. 문제는 귀하의 기기에 있는 것이 아닐 수도 있습니다. Apple 서버가 다운되었을 수도 있습니다. Apple의 시스템 상태 페이지를 방문하여 AppStore가 제대로 작동하는지 확인하세요. 문제가 있는 경우 Apple이 문제를 해결하기를 기다리는 것뿐입니다. 인터넷 연결 확인: "AppStore에 연결할 수 없음" 문제는 때때로 연결 불량으로 인해 발생할 수 있으므로 인터넷 연결이 안정적인지 확인하십시오. Wi-Fi와 모바일 데이터 간을 전환하거나 네트워크 설정을 재설정해 보세요(일반 > 재설정 > 네트워크 설정 재설정 > 설정). iOS 버전을 업데이트하세요.

PHP 코드를 작성할 때 클래스를 사용하는 것은 매우 일반적인 관행입니다. 클래스를 사용하면 관련 함수와 데이터를 단일 단위로 캡슐화하여 코드를 더 명확하고, 읽기 쉽고, 유지 관리하기 쉽게 만들 수 있습니다. 이 기사에서는 PHPClass의 사용법을 자세히 소개하고 구체적인 코드 예제를 제공하여 독자가 실제 프로젝트에 클래스를 적용하여 코드를 최적화하는 방법을 더 잘 이해할 수 있도록 돕습니다. 1. 클래스 생성 및 사용 PHP에서는 클래스 키워드를 사용하여 클래스를 정의하고 클래스의 속성과 메서드를 정의할 수 있습니다.
