对象克隆
对象在默认情况下都是按引用传递的,如果需要复制一个对象,将对象的值进行一个完整的cp,需要使用clone方法
1 | class Corporate_Drone{ private $employeeid ; private $tiecolor ; function setEmployeeID( $employeeid ) { $this ->employeeid = $employeeid ; } function getEmployeeID() { return $this ->employeeid; } function setTieColor( $tiecolor ) { $this ->tiecolor = $tiecolor ; } function getTieColor(){ return $this ->tiecolor; }} $drone1 = new Corporate_Drone(); $drone1 ->setEmployeeID( "12345" ); $drone1 ->setTieColor( "red" ); $drone2 = clone $drone1 ;
|
Salin selepas log masuk
上面是克隆一整个对象的,可以用__clone方法来调整对象克隆的行为,此方法只克隆操作期间执行
1 | class Corporate_Drone{ private $employeeid ; private $tiecolor ; function setEmployeeID( $employeeid ) { $this ->employeeid = $employeeid ; } function getEmployeeID() { return $this ->employeeid; } function setTieColor( $tiecolor ) { $this ->tiecolor = $tiecolor ; } function getTieColor(){ return $this ->tiecolor; } function __clone() { $this ->tiecolor = "blue" ;
|
Salin selepas log masuk
类继承
继承就是父亲和儿子的关系,儿子可以使用父亲的跑车,也可以自己买自行车的同时边开父亲的跑车,毕竟都是他们家的。
1 | class Employee{ private $name ; function setName( $name ) { if ( $name == "" ) echo "Name connot be blank!" ; else $this ->name = $name ; } function getName() { return "My name is " . $this ->name. "\n" ; }} class Executive extends Employee{
|
Salin selepas log masuk
继承和构造函数
如果父类有构造函数,而且子类没有构造函数,那么在子类实例化得时候是会执行父类的构造函数的,如果父类和子类同时都有构造函数的话,那么当子类实例化的时候,只会执行子类的构造函数,除非使用
parent显式调用父类构造函数,又或者直接调用父类的构造函数 classname::__construct()
继承与延迟静态绑定
有一种情况,一个父方法要与静态类属性交互,但这些静态类属性可能在子类被覆盖,那么怎么定义static静态类的作用域呢,之前一直也没有说这个情况,因为静态类定义本身就是仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
这种情况在php5.3后被解决。
1 | class Employee{ public static $favSport = "Football" ;
|
Salin selepas log masuk
接口和抽象类
接口定义了实现某种服务的一般规范,声明了必须的函数和常量,但是不指定如何实现。关键是要建立必须实现的一组一般原则,只有满足了这些原则才能说实现了这个接口。
抽象类是不能被实例化的类,只能作为由其他类继承的基类,例如一个名为media的类,他是用于描述各种公开出版的共同性质,因为media不表示真实的实体,而是一些相似实体的泛化表示,所以不实例化,这样就需要声明为抽象类,然后再由各种的派生的Media类继承此抽象类
什么时候用接口,什么时候用抽象类
- 如果要创建一个模型,这个模型将由一些紧密相关的对象引用,就可以采用抽象类,如果要创建将由一些不想关的对象采用的功能,应该用接口。
- 如果必须从多个来源继承行为,就是用接口。
- 如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现行为。接口无法实现。
命名空间
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
1 | < ?phpnamespace Foo\Bar; include 'file1.php' ; const FOO = 2; function foo() {} class foo{ static function staticmethod() {}} foo();
|
Salin selepas log masuk
本文由 PeterYuan 创作,采用 署名-非商业性使用 2.5 中国大陆 进行许可。 转载、引用前需联系作者,并署名作者且注明文章出处。神一样的少年 » 第三章(高级oop)-《php和mysql web开发》《php与mysql程序设计》齐读