• 微信:
  • hai764003
  • QQ:
  • 511211014
  • E-mail:
  • jaquery@163.com

案例总数51

访问总数312371

收藏总数310902

什么是面向对象?面向对象的简单了解!返回列表

上传时间:2015-02-02 内容关键字:什么是面向对象?面向对象的简单了解!


第八部:防止类外克隆。如果clone的话,不仅可以克隆出多个实例,而且原来单例模式中的静态 属性中存着的地址(static protected $ins)也跟着克隆,出现多个对象,这个效果就相当于类 外多次实例了。如何解决呢?


$t3 = clone t2;


解决:在类中加入魔术方法__clone(){} ,并且赋给它受保护的约束,这个时候如果在克隆对象的时候,这个方法将自动在类外调用,因为它受保护,所以无法在类外调用而报错,这样就可以防止它在clone了。


最终单例模式如下:


class single{

static protected $ins = null;

final protected function __construct(){}

static public function getInstance(){

if(self::$ins instanceof self){

return self::$ins;

}

self::$ins = new self();

return $ins;

}

private function __clone(){}

}

class t extends s{

这个类里是不能重写父类的构造函数的。其他的业务逻辑随便哦。

}

$t1 = t::getInstance();

$t2 = t::getInstance();

instance实例,of谁的,专门判断某个对象是不是某个类的实例用的。对象obj instanceof 类名。


四、魔术方法:


1. 概念:

魔术方法是指在某些情况下,会自动调用的方法。PHP面向对象中,提供了这几个魔术方法,他们 的特点都是以双下划线__开头的。


2. 作用:这些魔术方法在自己写框架和比较底层的时候比较有用。


3. 演示:

1. __get :当我们调用一个权限上不允许调用的属性时,__get方法会自动调用,并传参,参数值 是被调用的那个属性。比如:$lily调用age的时候,age属性时私有的在外部无权调用, 这个时候就把age当做参数传给了__get($p),这个时候__get就会去自动调用$age.


class Human{

private $age = 29;

public function __get($p){

echo ‘你想访问我的’.$p.’属性’;

}

}

$lily = new Human();

echo $lily->age .


2. __set : 当我们无权操作属性赋值时,或者操作不存在的属性赋值时,__set自动调用。且自动 传入两个参数,一个属性,一个属性值。

class Stu{

private $age = 23;

}

$human = new Stu();

$human->age = 28;

$human->age =28 // ----无权--- __set(‘age’,28);


3. __isset()方法:


当用isset()判断对象不可见不存在的属性时,__isset()被触发。


问题:如果用isset(属性)的话,还能相信属性真的存在吗?不行

答案:__isset(){return 1} 就可以骗过判断。


4. __unset()方法:

当用unset销毁对象不可见的属性时,会应发unset


4框架中魔术方法的使用:


THINKPHP中的一段用户注册代码:


$userModel->username = $_POST['username'];

$userModel->email = $_POST['email'];

if($num = $userModel->table('user')->add()){

echo "注册成功";

}else{

echo "fail";

}


思考:


1.  userModel就有username属性供你去赋值吗?

2. 如果$userModel->xxx属性,是保护的,而我的表又有一个字段敲好也叫xxx。那么我 自然是$user->xxx=$POST[‘xxx’];这不就出差了么。

3.  userModel有一些属性很正常,比如a,b,c,d...我在注册的时候,又动态设置了属性,f,g,h,i

疑问:在拼接sql的时候,得把a,b,c,d忽略才行,又怎么忽略呢?


 

小海哥推荐你看: 博客园  php教程分享网站  phpmywind  脚本之家