zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

2023-06-13 09:13:47 时间

类的定义:
  以关键字class开头,后面跟着类名,可以是任何非PHP保留字的名字。后面跟着一对花括号,里面包含有类成员和方法的定义。

伪变量$this
可以在当一个方法在对象内部调用时使用。$this是一个到调用对象(通常是方法所属于的对象,但也可以是另一个对象,如果该方法是从第二个对象内静态调用的话)的引用。
//??静态调用的内部到底是怎样的?
看个例子:
classA
{
  functionfoo()
  {
      if(isset($this)){
          echo"$thisisdefined(";
          echoget_class($this);
          echo")\n";
      }else{
          echo"\$thisisnotdefined.\n";
      }
  }
}
classB
{
  functionbar()
  {
      A::foo();
  }
}
$a=newA();
$a->foo();
A::foo();
$b=newB();
$b->bar();
B::bar();
输出结果为:
$thisisdefined(a)
$thisisnotdefined.
$thisisdefined(b)
$thisisnotdefined.
/*我希望知道这个例子的内存等的具体实现,我暂时无法理解。如果有人可以讲清楚,可以告诉我。我们宿舍牛头现在正在冬眠,等他醒来,我会问。*/

new
要创建一个对象的实例,必须创建一个新对象并将其赋给一个变量。当创建新对象时该对象总是被赋值,除非该对象定义了构造函数并且在出错时抛出了一个异常。
当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例时一样。可以用克隆给一个已创建的对象建立一个新实例。
(这几句话虽然很短,但是未必容易理解。)
例子如下:
classSimpleClass
{
  //成员声明
  public$var="adefaultvalue";

  //方法声明
  publicfunctiondisplayVar(){
      echo$this->var;
  }
}
//看下面的图.1>new在heap(堆)中实例化一个对象。2>将指针$instance指向他
$instance=newSimpleClass();
//3>将指针$assigned指向heap中的实例化对象
$assigned  = $instance;
//4>将$instance的引用(地址)赋值给$reference
$reference =&$instance;
$instance->var="$assignedwillhavethisvalue";
$instance=null;//5>间断$instance与heap中实例的连接。
var_dump($instance);
var_dump($reference);
var_dump($assigned);
输出:
NULL
NULL
object(SimpleClass)#1(1){
 ["var"]=>
   string(30)"$assignedwillhavethisvalue"
}
图示整个过程:


类继承extends
一个类可以在声明中用extends关键字继承另一个类的方法和成员。不能扩展多个类,只能继承一个基类。

被继承的方法和成员可以通过用同样的名字重新声明被覆盖,除非父类定义方法时使用了final关键字。可以通过parent::来访问被覆盖的方法或成员。(继承的机制到底怎样的?)
源代码如下:
classExtendClassextendsSimpleClass
{
  //Redefinetheparentmethod
  functiondisplayVar()
  {
      echo"Extendingclass\n";
      parent::displayVar();
  }
}
$extended=newExtendClass();
$extended->displayVar();
输出:
Extendingclass
adefaultvalue