//魔术方法,下面会通过一些实例来介绍魔术方法
//1:__get,__set 当给不存在的属性赋值或者获取某个不存在的属性的时候,会报这个错误
class student{
public $property;
public function __get($name){
if(isset($property[$name])) {
return $this->property[$name];
}
else
echo "dui buqi mei you suoxuyao debianliang ";
}
public function __set($name,$value){
if(isset($property[$name])) {
$this->property[$name]=$value;
echo "你要找的变量是:".$this->property[$name];
}
else
echo "对不起,没有你要找的变量的啊 大兄弟";
}
}
//下面进行对类的初始化
//我们调用不存在的属性的时候,会发现
$s=new student();
//调用一个不存在的属性
echo $s->name,"
",$s->age;
echo "
";
$s->dge='sd';
echo "
";
$s->age='cjs';
//总结一下,其实在我们项目使用过程中,调用不存在的变量是很容易出现的,为了不让程序报错,我们必须自己
//定义一下处理这中错误方式的方法,这就是魔术方法__get__,__set__提供给我们常用的
//**********************************************************************************
//2:__construct() __disConstruct() 前者作为函数的构造方法,在我们初始化类的时候会被调用,第二个做为析构函数,会在我们销毁
//实例变量的时候调用
//构造函数往往提供给我们用来给属性进行初始化的方法,这里面
class constructTest{
public $name;
public $age;
public function __construct($a,$b)
{
$this->name=$a;
$this->age=$b;
}
// php不像c++和java严格面向对象语言的方法,不能够实现构造函数的重载,如果我们给构造函数提供参数,也就意味着在实例化的时候提供相应的参数
// public function __construct($a,$b)
// {
//
// }
}
$a=new constructTest('cjs',20);
echo "
",$a->age,"
",$a->name,"
";
//总结:其实我们真正做项目的时候,常用的做法是保证类中只有一个实例可以使用,这就是我们常说的单例模式
//思路其实很简单,我们把构造函数私有化,然后提供一个公有的方法来判断,如果已经存在建立的实例,我们就
//直接返回已经创建的实例,如果不存在,我们就重新建立
class Instance{
//我们通过一个属性来保存新建的实例变量,很容易理解,如果我们用函数中的变量保存实例,那么在下一次
//调用函数获取实例的时候,就会重新初始化,这是我们不愿意看到的
private static $instance;
public $age;
private function __construct($a)
{
$this->age=$a;
}
//提供一个公有的方法给用户获取实例
public static function getInstance(){
if(!isset(self::$instance))
self::$instance=new Instance('cjs');
return self::$instance;
}
//这里面我们可以注意一下, ::是区域运算符,我们可以通过这个调用静态或者非金泰属性和方法
}
$a=Instance::getInstance();
$b=Instance::getInstance();
var_dump($a);
var_dump($b);
//3:__isset() __unset()
class student{
private $name;
private $age;
public $age1;
public function __isset($name){
echo "wocai ni xiang yaowomen".$name;
}
}
$x=new student();
if(isset($x->age1)){
echo "i have this";
}
//其实看,我们在判断不存在的属性的时候才会调用魔术方法__isset()
if(isset($x->tail))
echo "bucunzai";
//同理,我们在 使用ubset取消不存在的变量的时候,也会调用魔术方法__unset()