《PHP核心技术与最佳实践》读书笔记(面向接口与反射篇)

面向接口

面向过程,面向对象以及函数式编程 ——三大范式 
面向接口不属于其中。
接口可以是任何一个对外提供服务的出口。接口为抽象而生。

php与java,c++在接口方面的不同,java和C++中接口是起一个强制和契约的作用,而php这个作用打了折扣,可以调度接口中本不不存在的方法。但是,通常一个接口的实现类仅实现该接口所具有的方法,做到专一。

<?php
interface mobile {
    public function run();
}
class plain implements mobile {
    public function run() {
        echo "我是飞机";
    }
    public function fly() {
        echo "飞行";
    }
}
class car implements mobile {
    public function run() {
        echo "我是汽车";
    }
}
class machine {
    function demo(mobile $a) {
        $a->fly();
    }
}
$obj = new machine();
$obj->demo(new plain());
$obj->demo(new car());

由于php是弱类型,且强调灵活,所以并不推荐大规模使用接口,而是仅在部分“内核”代码中使用接口,因为PHP中的接口已经失去很多接口应该具有的予以。

反射

反射:根据到达地找到出发地和来源,导出提取出关于类、方法、属性、参数等的详细信息。
要获取某个对象的方法和属性列表:

<?php

class person {
    public $name;
    public $gender;
    public function say() {
        echo $this->$name,"\tis",$this->gender,"\r\n";
    }
    public function __set($name,$value) {
        echo "Setting $name to $value \r\n";
        $this->$name = $value;
    }
    public function __get($name) {
        if(!isset($this->$name)) {
            echo "未设置";
            $this->$name = "正在为你设置默认值";
        }
        return $this->$name;
    }
}

$student = new person();
$student->name = 'Tom';
$student->gender = 'male';
$student->age = 24;
//获取对象属性列表
$reflect = new ReflectionObject($student);
$props = $reflect->getProperties();
foreach ($props as $prop) {
    print $prop->getName()."\n";
}
//获取对象方法列表
$m = $reflect->getMethods();
foreach ($m as $prop) {
    print $prop->getName()."\n";
}

?>

打印的结果
Setting age to 24 name gender age say __set __get
也可以直接用class函数,不用反射

var_dump(get_object_vars($student));
var_dump(get_calss_vars(get_class($student)));
var_dump(get_class_methods(get_class($student)));
echo get_class($student)

反射的作用:
反射可以用于生成文档,可以用于它对文件里的类进行扫描,逐个生成描述文档。可以做hook实现插件功能,或者是动态代理。
对对象调试用到,获取类的信息时候用到。反射消耗较大,不要滥用。反射会破坏类的封装性,善用反射能保持代码的优雅和简洁。

你可能感兴趣的:(PHP)