-
多态 <?php date_default_timezone_set("PRC"); /** * 多态 * 1. 只要某个对象实现了接口(instanceof),就可以直接在对象上调用接口的方法 */ interface ICanEat { public function eat($food); } // Human类实现了ICanEat接口 class Human implements ICanEat { // 跟Animal类的实现是不同的 public function eat($food){ echo "Human eating " . $food . "\n"; } } // Animal类实现了ICanEat接口 class Animal implements ICanEat { public function eat($food){ echo "Animal eating " . $food . "\n"; } } function eat($obj){ if($obj instanceof ICanEat){ $obj->eat("FOOD"); // 不需要知道到底是Human还是Animal,直接吃就行了 }else{ echo "Can't eat!\n"; } } $man = new Human(); $monkey = new Animal(); // 同样的代码,传入接口的不同实现类的时候,表现不同。这就是为什么成为多态的原因。 eat($man); eat($monkey); ?>查看全部
-
接口 (2) // step1 不同的类可以实现同一个接口,定义接口方法的不同实现 $man = new Human(); $man->eat("Apple"); $monkey = new Animal(); $monkey->eat("Banana"); // step2 尝试删除Human的eat方法并运行 // 实现了某个接口的类必须提供接口中定义的方法 // step3 不能用接口创建对象,但是能够判断某个对象是否实现了某个接口 //$eatObj = new ICanEat(); var_dump($man instanceof ICanEat); // 判断某个对象是否实现了某个接口 // step 4 接口可以继承接口 interface ICanPee extends ICanEat { public function pee(); } class Human1 implements ICanPee{ public function pee(){} } ?>查看全部
-
接口 (1) <?php date_default_timezone_set("PRC"); /** * 接口 * 1. 接口的基本概念和基本使用方法 * 2. 接口里面的方法没有具体的实现 * 3. 实现了某个接口的类必须提供接口中定义的方法 * 4. 不能用接口创建对象,但是能够判断某个对象是否实现了某个接口 * 5. 接口可以继承接口(interface extends interface) * 6. 接口中定义的所有方法都必须是公有,这是接口的特性。 */ interface ICanEat { public function eat($food); } // Human类实现了ICanEat接口 class Human implements ICanEat { // 跟Animal类的实现是不同的 public function eat($food){ echo "Human eating " . $food . "\n"; } } // Animal类实现了ICanEat接口 class Animal implements ICanEat { public function eat($food){ echo "Animal eating " . $food . "\n"; } }查看全部
-
类的继承 <?php date_default_timezone_set("PRC"); /** * 重写和Final * 1. 子类中编写跟父类完全一致的方法可以完成对父类方法的重写 * 2. 对于不想被任何类继承的类可以在class之前添加final关键字 * 3. 对于不想被子类重写(overwrite, 修改)的方法,可以在方法定义前面添加final关键字 */ class BaseClass { public function test() { echo "BaseClass::test() called\n"; } public function moreTesting() { echo "BaseClass::moreTesting() called\n"; } } class ChildClass extends BaseClass { // 重写时参数不一定要跟父类完全一致 public function moreTesting($tmp=null) { echo "ChildClass::moreTesting() called\n"; } } // Results in Fatal error: Cannot override final method BaseClass::moreTesting() $obj = new ChildClass(); $obj->moreTesting(); ?>查看全部
-
魔术方法 (2) // 通过这两个方法可以实现动态的对象属性 public function __get($name){ return "Getting the property " . $name; } public function __set($name, $value){ echo "Setting the property " . $name . " to value ". $value. "\n"; } public function __isset($name){ echo "__isset invoked\n"; return false; } public function __unset($name){ echo "unsetting property " . $name; } } $obj = new MagicTest(); echo $obj->name . "\n"; $obj->name = "Name Value"; echo '$obj->name is set? '. isset($obj->name) . "\n"; echo '$obj->name is empty?' . empty($obj->name) . "\n"; unset($obj->name); ?>查看全部
-
魔术方法 (1) <?php date_default_timezone_set("PRC"); /** * 魔术方法3之属性重载 * 1. 在给不可访问属性赋值时,__set() 会被调用。 * 2. 读取不可访问属性的值时,__get() 会被调用。 * 3. 当对不可访问属性调用 isset() 和empty()时,__isset() 会被调用。 * 4. 当对不可访问属性调用 unset() 时,__unset() 会被调用 */ class MagicTest{ public function __tostring(){ return "This is the Class MagicTest.\n"; } public function __invoke($x){ echo "__invoke called with parameter " . $x . "\n"; } public function __call($name, $arguments){ echo "Calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n"; } public static function __callStatic($name, $arguments){ echo "Static calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n"; }查看全部
-
对不可访问属性调用isset()和empty()时,会触发__isset()魔术方法,注意isset和empty不是相反的关系,isset判断的是值是否被定义过,empty认为没定义过的返回true查看全部
-
既然类可以实现,为什么还要用接口? 接口是一种标准,简单说,比如有个说话的函数/方法,有些人用say(),有些人用shuo(),有些人用其他的,这可不行,这时候定义一个接口,所有人都得用同一个写法查看全部
-
$this是php中的伪变量,可以通过其访问对象的属性及方法查看全部
-
Object Oriented查看全部
-
我非常熟悉面向对象!查看全部
-
clone 可以克隆一个属性完全相同的一个新对象。例: $james = new NbaPlayer(); $james->name = 'James'; $james2 = clone $james; echo $james2->name; 如果类里实现了__colne()方法,则在调用clone方法时,会调用__clone方法。例:查看全部
-
当对不可访问的属性调用unset()时,__unset()会被调用查看全部
-
__isset($name); //当对不可访问属性调用isset()或empty()方法时被调用查看全部
-
__set(); //在给不可访问属性赋值时被调用查看全部
举报
0/150
提交
取消