PHP语言面向对象学习之二:深入了解面向对象高级特性
小标 2018-07-12 来源 : 阅读 1098 评论 0

摘要:本文主要向大家介绍了PHP语言面向对象学习之二:深入了解面向对象高级特性,通过具体的实例向大家展示,希望对大家学习php语言有所帮助。

本文主要向大家介绍了PHP语言面向对象学习之二:深入了解面向对象高级特性,通过具体的实例向大家展示,希望对大家学习php语言有所帮助。

静态方法(static)和属性:通过类而不是对象来访问数据和功能

静态方法是以类作为作用于的函数,不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性。

如果修改了一个静态属性,那么这个类的所有实例都能访问到这个新值。

例如:

[php] view plain copy print?

1. print staticExample::$aNum;  

2. StaticExample::sayHello();  


要点:除非是访问一个被覆写的方法,负责永远只能用::访问被明确声明为static的方法和属性。

①:不能在对象中调用静态方法

②:不能在静态方法中使用伪变量$this

[php] view plain copy print?

1. <?php  

2. /** 

3.  * 静态方法和属性:通过类而不是对象来访问数据和功能 

4.  * =============注解 

5.  * 只有使用parent关键字调用方法时,才能对一个非静态方法进行静态形式调用(一个子类可以使用parent关键字访问父类,self关键字从当前类中访问静态方法或属性)  

6.  */  

7.   

8. /** 

9.  * 构建shopProduct类的一个静态方法来自动实例化shopProduct对象(在上节的shopProduct类基础上增加) 

10.  * @return object shopProduct对象 

11.  */  

12.  class shopProduct{  

13.     private $id=0;  

14.     //上节类中的内容  

15.     //...  

16.     public function setID($id){  

17.         $this->id=$id;  

18.     }  

19.     public static function getInstance($id, PDO $pdo){  

20.         $stmt=$pdo->prepare("select * from products where id=?");  

21.         $result=$stmt->execute(array($id));  

22.         $row=$stmt->fetch();  

23.         //实例化CD类  

24.         $product=new CDProudct($row['title'], $row['firstname'], $row['mainname'], $row['price'], $row['playlength']);  

25.         $product->setId($row['id']);  

26.         $product->setDiscount($row['dusciybt']);  

27.         return $product;  

28.     }  

29.  }  

30.  /* 

31.   * 这样的方法有点像 工厂,可以接受原始数据或配置 据此产生对象 

32.   */  

33.  $dsn='sqlite://home/db/bob/projects/products.db';  

34.  $pdo=new PDO($dsn, null, null);  

35.  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  

36.  $obj=shopProduct::getInstance(1, $pdo);  

37.    

 

抽象类(abstract class)和接口(interface):设计和现实相分离

抽象类不能直接被实例化,只定义(活部分实现)子类需要的方法,子类可以继承它并且通过实现其中的抽象方法,使抽象类具体化。

抽象类至少包含一个抽象方法

[php] view plain copy print?

1. abstract class shopProductWriter{  

2.     protected $products=array();  

3.     abstract public function write();  

4. }  

 

[php] view plain copy print?

1. <?php  

2. /** 

3.  * 抽象类实例 

4.  * @author lxm 

5.  */  

6. abstract class shopProductWriter{  

7.     protected $products=array();  

8.     public function addProduct(shopProduct $shopProduct){  

9.         $this->products[]=$shopProduct;  

10.     }  

11.     abstract public function write();  

12. }  

13. /** 

14.  * 输出XML 

15.  */  

16. class xmlProductWriter extends shopProductWriter{  

17.     public function write(){  

18.         $str='<?xml version="1.0" encoding="UTF-8"?>'."\n";  

19.         $str.="<products>\n";  

20.         foreach ($this->products as $shopProduct){  

21.             $str.="\t<product title=\"".$shopProduct->getTitle()."\">\n";  

22.             //...  

23.         }  

24.         $str.="</products>\n";  

25.     }  

26. }  

 

抽象类提供了具体实现的标准,而接口(interface)则是纯粹的模板。接口只能定义功能,而不包含实现的内容

接口可以包含属性和方法声明,但是方法为空

例如:

[php] view plain copy print?

1. interface Chargeable{  

2.   public function getPrice();  

3. }  

 

[php] view plain copy print?

1. class shopProduct implements Chargeable{  

2.   //...  

3.   public function getPrice(){  

4.     return ;//...  

5.   }  

6. }  

 

拦截器方法:自动委托

PHP提供内置拦截器interceptor方法,可以 拦截 发送到未定义发放和属性的消息。

__get($property)       访问未定义的属性时被调用

__set($property,$value)  给未定义的属性赋值时被调用

__isset($property)   对未定义的属性调用isset()时被调用

__unset($property) 对未定义的属性调用unset()时被调用

__call($method,$arg_array)   调用未定义的方法时被调用

[php] view plain copy print?

1. <?php  

2. /** 

3.  * 使用拦截器 访问未定义属性时,__get()被调用 

4.  * 如果不存在什么也不做,用户试图访问的属性被解析为NULL 

5.  */  

6. class Person{  

7.     function __get($property){  

8.         $method="get".$property;  

9.         if(!method_exists($this, $method)){  

10.             return $this->$method();  

11.         }  

12.     }  

13.     function getName(){  

14.         return "Bob";  

15.     }  

16.     function getAge(){  

17.         return 24;  

18.     }  

19. }  

20. $p= new Person();  

21. print $p->name;  

析构方法:对象销毁前的清理工作

在对象被垃圾收集器收集前(即对象从内存中删除之前)自动调用。

[php] view plain copy print?

1. <?php  

2. /** 

3.  * 需要把自身信息写入数据库,用析构方法在对象实例被删除时确保实例把自己保存到数据库中 

4.  */  

5. class Person{  

6.     private $name;  

7.     private $age;  

8.     private $id;  

9.     function __construct($name,$age){  

10.         $this->name=$name;  

11.         $this->age=$age;  

12.     }  

13.     function setID($id){  

14.         $this->id=$id;  

15.     }  

16.     function __destruct(){  

17.         if(!empty($this->id)){  

18.             //保存Person数据   

19.             print "saving person\n";  

20.         }  

21.     }  

22. }  

23. $person=new Person("bob", 24);  

24. $person->setID(111);  

25. unset($person);  

26. //输出  

27. //保存Person  

回调:用匿名函数为组件添加功能

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言PHP频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程