深入分析php之面向对象


Posted in PHP onMay 15, 2013

以前对面向对象仅限于死记硬背型,工作这么久了,回过头来看又是一翻体悟,供大家看看。
1.final
final:php5新增一个final关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法;如果一个类被声明final,则不能被继承。

class BaseClass{
     public function test(){
          ehco "test";
     }     final public function moreTest(){
          echo "moretest";
     }
}
class ChildClass extends BaseClass{
     public function moreTest(){
          echo "moretest";
     }
}
// 产生 Fatal error: Cannot override final method BaseClass::moretest()

2.__toString(建议用PHP5.2或者更高版本)
class Person{
     protected $name;
     protected $email;     public function setName($name){
          $this->name = $name;
     }
     public function setEmail($email){
          $this->email = $email;
     }
     public function __toString(){
          return "$this->name <$this->email>";
     }
}
$rasums = new Person;
$rasums->setName('test');
$rasums->setEmail('test@qq.com');
print $rasums;

3.接口和抽象类
接口的作用:你想要保证一个类按照特定的名称、可见性和原型实现一个或多个方法。
接口的要求:
     类中全部为抽象方法
     抽象方法钱不用加abstract
     接口抽象方法属性为public
     成员属性必须为常量
例:
interface ChildTest{
     public function childTest();
}
class FathTest implements ChildTest1,ChildTest2{
     public function childTest(){
          echo 1;
     }
     …………
}

抽象的作用: 其实抽象类和接口类有一部分很像,记得在哪里看见这样一句话,抽象类就把类像的部分抽出来,这句看上去很搞笑,其实它说出了抽象类的真理,抽象类的作用 是,当你发现你的很多类里面用很多方法你不断的在重复写,那你就可以考虑使用抽象类了,你可能会说“我不是可以重写一个类每个公共类我个实例化一个这个公 共类,调用相同的方法就可以了”,这里是可以,实际上抽象类做的工作也就是这个,不过他省去了你实例化的这个步骤,让你就像直接调用本类方法一样方便,而 且你还可以重载这个方法。
抽象的要求:
     类中至少有一个抽象方法
     抽象方法钱必须加abstract
例:
abstract class Database{
     abstract public function connect();
     abstract public function query();
     abstract public function fetch();
     abstract public function close();
}

注:抽象方法不能定义为私有方法、不能定义为最终方法,因为它们需要被继承。

4.传递对象引用
php4:所有“=”都是创建一个副本
php5:除了对象外,其他“=”进行赋值时,都是创建一个副本;而对象则是引用

5.克隆对象
一、
聚合类:
__call方法简介:
当客户端代码用类中未定义的方法时,__call会被调用。
__call()接受两个参数,一个是方法名称,另一个是传递给要调用方法的所有参数(包括数组)
__call()方法返回的任何值都会返回给客户,将好像调用方式真实存在一样
例:

class Address{
     protected $city;
     protected $country;
     public function setCity($city){$this->city = $city;}
     public function getCity(){return $this->city;}
     public function setCountry($country){$this->country = $country;}
     public function getCountry(){return $this->country;}
}
class Person{
     protected $name;
     protected $address;
     //浅克隆
     public function __construct(){
          $this->address = new Address;
     }
     public function setName($name){
          $this->name = $name;
     }
     public function getName(){
          return $this->name;
     }
     public function __call($method,$arguments){
          if(method_exists($this->address,$method)){
               return call_user_func_array(array($this->address,$method),$arguments);
          }
     }
     //深克隆
     public function __clone(){
          $this->address = clone $this->address;
     }
}
$test1 = new Person;
$test2 = clone $test1;
$test1->setName('testname1');
$test1->setCity('testcity1');
$test2->setName('testname2');
$test2->setCity('testcity2');
echo $test1->getName().'-'.$test1->getCity()."\n";
echo $test2->getName().'-'.$test2->getCity()."\n";
//testname1-testcity2
//testname2-testcity2

6.重要属性访问(__set __get __isset __unset) __isset __unset5.1之后才有用
作用:拦截对属性的需求,为了提高分离的程度,还要实现__isset()和__unset(),以便当我们用isset来检测属性或者unset()来删除属性,来保证类的行为正确
例:
class Person{
     protected $__data = array('email','test');
     public function __get($property){
          if(isset($this->__data[$property])){
               return $this->__data[$property];
          }else{
               return false;
          }
     }
     public function __set($property,$value){
          if(isset($this->__data[$property])){
               return $this->__data[$property] = $value;
          }else{
               return false;
          }
     }
     public function __isset($property){
          if(isset($this->__data[$property])){
               return true;
          }else{
               return false;
          }
     }
     public function __unset($property){
          if(isset($this->__data[$property])){
               return unset($this->__data[$property]);
          }else{
               return false;
          }
     }
}
$test = new Person;
$test->email= 'test';
var_dump($test->email);

注意:
     这两个方法只会捕捉缺少的属性,如果你为你的类定义了一个属性,那么当访问这个属性时php不会调用__get()和__set();
     这两个方法完全破坏了任何属性继承的想法。如果父对象中有个 __get()方法,而你在子类中又实现了自己的__get()方法,那么你的对象不会正确的执行,因为父类的__get()方法永远不会被调用,当然可以用parent::__get()解决
缺点:
     速度相对较慢
     使用魔术访问器方法就不可能在使用反射类,如phpdocumentor这类的工具将代码自动文档化
     不能将其用于静态属性
PHP 相关文章推荐
php基础知识:类与对象(2) 自动加载对象
Dec 13 PHP
PHP 5.0对象模型深度探索之类的静态成员
Mar 27 PHP
PHP下通过file_get_contents的代理使用方法
Feb 16 PHP
PHP用GD库生成高质量的缩略图片
Mar 09 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
PHP 登录完成后如何跳转上一访问页面
Jan 14 PHP
PHP测试成功的邮件发送案例
Oct 26 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
May 29 PHP
php实现微信支付之企业付款
May 30 PHP
PHP使用函数用法详解
Sep 30 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 PHP
深入解析php之apc
May 15 #PHP
深入解析php之sphinx
May 15 #PHP
基于php设计模式中单例模式的应用分析
May 15 #PHP
基于php设计模式中工厂模式详细介绍
May 15 #PHP
php笔记之:数据类型与常量的使用分析
May 14 #PHP
PHP笔记之:基于面向对象设计的详解
May 14 #PHP
php在window iis的莫名问题的测试方法
May 14 #PHP
You might like
PHP+Mysql+Ajax+JS实现省市区三级联动
2014/05/23 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
2010/03/07 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
dojo随手记 gird组件引用
2011/02/24 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
禁止ajax缓存获取程序最新数据的方法
2013/11/19 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
python异常和文件处理机制详解
2016/07/19 Python
python正则实现计算器功能
2017/12/14 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
Django保护敏感信息的方法示例
2019/05/09 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
基于opencv实现简单画板功能
2020/08/02 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
浅析python 字典嵌套
2020/09/29 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
Burt’s Bees英国官网:世界领先的天然个人护理品牌
2020/08/17 全球购物
linux面试题参考答案(6)
2016/06/23 面试题
体育节口号
2014/06/19 职场文书
作风建设整改方案
2014/10/27 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
施工安全责任协议书
2016/03/23 职场文书
理解深度学习之深度学习简介
2021/04/14 Python