PHP5权威编程阅读学习笔记 附电子书下载
|
PHP 5 权威编程(PHP 5 Power Programming) PDF下载地址 //www.jb51.cc/books/28207.htmlPHP4中,不使用construct()作为构造函数的名字,必须使用类的名字定义一个方法,就像在C++中一样。 访问控制对象属性的访问保护是OOP的一个关键范例 Public:可以在任何地方被访问 Protected:类成员可以被其所在类的子类和父类从对象内部的方法访问 Private:类成员只能被其所在类从对象内部的方法访问,而无法从继承类的成员中访问到。因为私用成员不会被继承,所以两个相关的类完全可以分别声明一个名字相同的私有变量。 也就是两个类都只能看到自己的私有属性,私有成员之间是没有关系的。 例子: <div class="codetitle"><a style="CURSOR: pointer" data="76080" class="copybut" id="copybut76080" onclick="doCopy('code76080')"> 代码如下:<div class="codebody" id="code76080"> <?php / Define MyClass / class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new MyClass(); echo $obj->public; // 这行能被正常执行 echo $obj->protected; // 这行会产生一个致命错误 echo $obj->private; // 这行也会产生一个致命错误 $obj->printHello(); // 输出 Public、Protected 和 Private / Define MyClass2 / class MyClass2 extends MyClass { // 可以对 public 和 protected 进行重定义,但 private 而不能 protected $protected = 'Protected2'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new MyClass2(); echo $obj->public; // 这行能被正常执行 echo $obj2->private; // 未定义 private echo $obj2->protected; // 这行会产生一个致命错误 $obj2->printHello(); // 输出 Public、Protected2,但不会输出 Private 注意:类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。 静态方法静态方法可以不创建对象实例就通过 类名::静态方法 来调用,也可以在一个对象实例中通过$this->静态方法或self::静态方法来调用。 <div class="codetitle"><a style="CURSOR: pointer" data="15601" class="copybut" id="copybut15601" onclick="doCopy('code15601')"> 代码如下:<div class="codebody" id="code15601"> <?php class Foo { public static $my_static = 'foo'; public static function staticValue() { return self::$my_static;//在类中访问静态成员使用self关键字 } } $obj=new Foo(); echo $obj->staticValue();//方式一 echo Foo::staticValue();//方式二 ?> 克隆对象在PHP4中,new一个对象的时候,返回的是“对象本身” 在PHP5中,new一个对象的时候,返回的是“指向对象的句柄” 这意味着在PHP5中,将对象实例($obj1)赋值给另一个变量($obj2)的时候,两个对象都是指向同一块内存区域。 比如 : <div class="codetitle"><a style="CURSOR: pointer" data="97038" class="copybut" id="copybut97038" onclick="doCopy('code97038')"> 代码如下:<div class="codebody" id="code97038"> <?php class test{ public $str; } $obj1=new test(); $obj1->str="obj1"; $obj2= $obj1; $obj2->str="obj2"; echo $obj1->str;//将输出“obj1” ?> 由于$obj1和$obj2指向的是同一块内存区域,因此使用任何一个对象修改其中的成员变量的值的时候,都会影响到另一个对象。 但是在有些时候,我们确实需要复制一个对象的拷贝(两块相互独立的内存区域),这时候可以使用语言命令clone 参考下面的例子; <div class="codetitle"><a style="CURSOR: pointer" data="79285" class="copybut" id="copybut79285" onclick="doCopy('code79285')"> 代码如下:<div class="codebody" id="code79285"> <?php class test{ public $str; } $obj1=new test(); $obj1->str="obj1"; $obj2= clone $obj1; $obj2->str="obj2"; echo $obj1->str;//将输出“obj2” ?> parent::和self::self::指向当前类,而且通常用来访问静态成员,方法和常量 parent::指向父类,而且它经常被用来调用父类的构造函数和方法,也可以用来访问父类的成员和常量 注意:你应该使用parent::而不是父类的某个具体的名字,因为这样可以令你方便的更改你的类的层次。 例子: <div class="codetitle"><a style="CURSOR: pointer" data="5988" class="copybut" id="copybut5988" onclick="doCopy('code5988')"> 代码如下:<div class="codebody" id="code5988"> <?php class Father{ public function construct(){ echo "调用父类的构造函数 "; } } class Son extends Father { public function construct(){ parent::construct();//方式一 // Father::construct();//方式二 echo "调用子类的构造函数"; } } $son=new Son(); ?> 结果: 调用父类的构造函数 调用子类的构造函数 推荐使用方式一,原因上面已经说了。 instanceof实例<div class="codetitle"><a style="CURSOR: pointer" data="25878" class="copybut" id="copybut25878" onclick="doCopy('code25878')"> 代码如下:<div class="codebody" id="code25878"> <?php class Rectangle { public $name=CLASS; } class Square extends Rectangle { public $name=CLASS; } class Circle{ public $name=CLASS; } function checkIfRectangle($shape){ if ($shape instanceof Rectangle ){ echo $shape->name; }else { echo "该对象不是Rectangle类的实例"; } } checkIfRectangle(new Square());//输出:Square checkIfRectangle(new Circle());//输出:该对象不是Rectangle类的实例 ?> 注:CLASS是一个特殊的常量,用来存储当前类的名字 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
