深入分析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 相关文章推荐
实用函数2
Nov 08 PHP
php 变量定义方法
Jun 14 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
Nov 01 PHP
php笔记之:php函数range() round()和list()的使用说明
Apr 26 PHP
php创建基本身份认证站点的方法详解
Jun 08 PHP
php判断字符串在另一个字符串位置的方法
Feb 27 PHP
PHP使用socket发送HTTP请求的方法
Feb 14 PHP
Symfony2中被遗弃的getRequest()方法分析
Mar 17 PHP
php实现简单的权限管理的示例代码
Aug 25 PHP
php实现微信企业转账功能
Oct 02 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
Oct 24 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
May 02 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 Document 代码注释规范
2009/04/13 PHP
php实现的短网址算法分享
2014/06/20 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
jquery 选项卡效果 新手代码
2011/07/08 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
JS中捕获console.log()输出的方法
2015/04/16 Javascript
JavaScript运算符小结
2015/06/03 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
Node.js Streams文件读写操作详解
2016/07/04 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
python+selenium+autoit实现文件上传功能
2017/08/23 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
python pandas修改列属性的方法详解
2018/06/09 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
Python实现京东抢秒杀功能
2021/01/25 Python
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
什么是静态路由?什么是动态路由?各自的特点是什么?
2015/09/16 面试题
销售高级职员求职信
2013/10/29 职场文书
电视购物广告词
2014/03/19 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
机械系毕业生求职信
2014/05/28 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python
Python 内置函数速查表一览
2021/06/02 Python
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫
MySQL数据库表约束讲解
2022/06/21 MySQL
MySQL主从切换的超详细步骤
2022/06/28 MySQL