什么是面向对象?面向对象的简单了解!返回列表
上传时间: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-fpm 基础介绍
- 下一篇:COOKIE、SESSION之彻底搞定!