深入分析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实现多服务器session共享之NFS共享的方法
Mar 16 PHP
php echo 输出字符串函数详解
May 13 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
Jul 04 PHP
php中count获取多维数组长度的方法
Nov 03 PHP
php查询mssql出现乱码的解决方法
Dec 29 PHP
详解PHP的Yii框架中日志的相关配置及使用
Dec 08 PHP
thinkphp3.x中cookie方法的用法分析
May 19 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
Jun 01 PHP
php获取微信基础接口凭证Access_token
Aug 23 PHP
PHP信号处理机制的操作代码讲解
Apr 19 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 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工厂模式的好处
2013/06/18 PHP
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
JS基础之undefined与null的区别分析
2011/08/08 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
js使用removeChild方法动态删除div元素
2014/08/01 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
2014/10/11 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
2016/05/27 Javascript
JS脚本实现动态给标签控件添加事件的方法
2016/06/02 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
vue打包相关细节整理(小结)
2018/09/28 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
2019/04/20 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
跟老齐学Python之深入变量和引用对象
2014/09/24 Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
Python线程详解
2015/06/24 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
Python解释器及PyCharm工具安装过程
2020/02/26 Python
python 制作本地应用搜索工具
2021/02/27 Python
AmazeUI 按钮交互的实现示例
2020/08/24 HTML / CSS
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
生产副总岗位职责
2013/11/28 职场文书
python中requests库+xpath+lxml简单使用
2021/04/29 Python
对Golang中的FORM相关字段理解
2021/05/02 Golang