摘要:本文主要向大家介绍了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频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号