类的定义: 以关键字 class 开头,后面跟着类名,可以是任何非 PHP 保留字的名字。后面跟着一对花括号,里面包含有类成员和方法的定义。
伪变量$this 可以在当一个方法在对象内部调用时使用。$this 是一个到调用对象(通常是方法所属于的对象,但也可以是另一个对象,如果该方法是从第二个对象内静态调用的话)的引用。 //??静态调用的内部到底是怎样的? 看个例子: class A { function foo() { if (isset($this)) { echo '$this is defined ('; echo get_class($this); echo ")\n"; } else { echo "\$this is not defined.\n"; } } } class B { function bar() { A::foo(); } } $a = new A(); $a->foo(); A::foo(); $b = new B(); $b->bar(); B::bar(); 输出结果为: $this is defined (a) $this is not defined. $this is defined (b) $this is not defined. /*我希望知道这个例子的内存等的具体实现,我暂时无法理解。如果有人可以讲清楚,可以告诉我。我们宿舍牛头现在正在冬眠,等他醒来,我会问。*/
new 要创建一个对象的实例,必须创建一个新对象并将其赋给一个变量。当创建新对象时该对象总是被赋值,除非该对象定义了构造函数并且在出错时抛出了一个异常。 当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例时一样。可以用克隆给一个已创建的对象建立一个新实例。 (这几句话虽然很短,但是未必容易理解。) 例子如下: class SimpleClass { // 成员声明 public $var = 'a default value';
// 方法声明 public function displayVar() { echo $this->var; } } //看下面的图.1>new 在heap(堆)中实例化一个对象。2>将指针$instance指向他 $instance = new SimpleClass(); //3>将指针$assigned指向heap中的实例化对象 $assigned = $instance; //4>将$instance的引用(地址)赋值给$reference $reference =& $instance; $instance->var = '$assigned will have this value'; $instance = null; // 5>间断$instance与heap中实例的连接。 var_dump($instance); var_dump($reference); var_dump($assigned); 输出: NULL NULL object(SimpleClass)#1 (1) { ["var"]=> string(30) "$assigned will have this value" } 图示整个过程:
类继承extends 一个类可以在声明中用 extends 关键字继承另一个类的方法和成员。不能扩展多个类,只能继承一个基类。
被继承的方法和成员可以通过用同样的名字重新声明被覆盖,除非父类定义方法时使用了 final 关键字。可以通过 parent:: 来访问被覆盖的方法或成员。(继承的机制到底怎样的?) 源代码如下: class ExtendClass extends SimpleClass { // Redefine the parent method function displayVar() { echo "Extending class\n"; parent::displayVar(); } } $extended = new ExtendClass(); $extended->displayVar(); 输出: Extending class a default value
|