php基础知识:类与对象(1)

  类的定义:

  以关键字 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"

  }

  图示整个过程:

php基础知识:类与对象(1)

  类继承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