self和parent和魔术方法 和自动加载
之前有个this 伪对象,其实就是指本对象。
如果这个程序给别人用,并且改了名字,类内部只要用到类名的地方,都可以改为self,为了方便使
用和修改。
php增加了self和parent来代指。
this 代表 本对象
self 代表 本类
parent 代表父类
之前的单例:
1 class Aa{ 2 public $rand; 3 static public $ob=null; 4 final protected function __construct(){ 5 $this->rand = mt_rand(100000,999999); 6 } static public function getIns(){ 7 if(self::$ob === null){ 8 self::$ob = new Aa();//也可以self 9 } return self::$ob; 10 }}var_dump(Aa::getIns());
利用parent 调用父类的方法
1 class Par{ 2 public function __construct(){ 3 echo rand(11111,99999); 4 }}classd Son extends Par{ 5 public function __construct(){ 6 echo 1111; 7 }}new Son();
很多程序都有自行执行方法,如果我继承过来,我自己的方法里面也需要使用自动执行,并且还需要
使用父类的自动执行。
1 class Par{ 2 public function __construct(){ 3 echo rand(11111,99999); 4 }}class Son extends Par{ 5 public function __construct(){ 6 parent::__construct(); 7 echo 1111; 8 }}new Son();
所谓魔术方法:
在某种场景下,能够自动调用的方法。
__construct() :构造函数,new实例化时自动调用
__destruct() :析构方法,对象销毁时自动调用
__get(属性名):在没有权限或者没有此值并且想取值的时候自动调用
__set( 属性名,,属性值 ) :在没有权限或者没有此值并且想赋值的时候自动调用
__isset(属性名) :在没有权限使用isset函数的时候自动调用
__unset(属性名) :在没有权限使用unset函数的时候自动调用
__toString() :将一个对象当做字符串输出的时候自动调用
__invoke() :将对象当做函数调用的时候自动调用
__call(方法名, 实参值)) :调用一个不存在的方法的时候自动调用
__callStatic(方法名,实参值) : 调用一个不存在的静态方法的时候自动调用
__clone():使用clone关键字得到对象的时候自动调用
1 class Zhaosi{ 2 private $xiaosan; 3 private $fbb; 4 private $dongcao; 5 private $xiayu; 6 7 //访问或者不可见属性时被调用 8 public function __get($a){ 9 echo $a; 10 } public function __set($b,$c){ 11 echo $b,'------',$c; 12 } public function __isset($f){ 13 echo $f; 14 } public function __unset($h){ 15 echo $h; 16 }}$aaa = new Zhaosi(); 17 $aaa->xiaosan; 18 $aaa->fbb='欧耶'; 19 isset($aaa->dongcao); 20 unset($aaa->xiayu);
__toString __invoke
1 <?php 2 class A{ 3 //将一个对象当作字符串输出的时候自动调用 4 public function __toString(){ 5 //类的说明 6 //必须返回一个字符串的值 7 return '我是打印对象返回的字符串!'; 8 } 9 10 public function say(){ 11 echo '我说了!!'; 12 } 13 14 //将对象当作函数调用的时候会自动调用 15 public function __invoke(){ 16 //用来排除错误 17 //echo '把对象当作函数调用的使用调用这个方法'; 18 echo '大哥这是个对象 请不要使用函数的形式调用'; 19 } 20 } 21 $a = new A; 22 //此处省略10000字 23 //将对象当作字符串输出 24 echo $a; 25 //当作函数调用 26 $a();
__call``__callStatic
1 <?php 2 class A{ 3 4 //调用一个不存在的方法的时候自动调用 5 public function __call($a,$b){ 6 //第一个参数是调用的方法名 7 var_dump($a); 8 //第二个参数是调用时候传递过来的实参 9 var_dump($b); 10 echo 404⻚⾯~~~~~'; 11 //exit; 12 }//调用一个不存在的 静态方法的时候会自动调用 13 static public function __callStatic($a,$b){ 14 //第一个参数是调用的方法名 15 var_dump($a); 16 //第二个参数是调用时候传递的实参 17 var_dump($b); 18 }}$a = new A; 19 //输出不存在的属性的 notice (无视) 20 //echo $a->name; 21 // echo $a->eat('饭','吃','吃草','吃翔'); 22 // echo $a->say('说快办','说说'); 23 // echo $a->asldkfjkalsdjfkasdjfkjasdlfjaksldjfd(1); 24 A::xiangfangjia('做梦吧');
__clone
1 <?php 2 class A{ 3 public $name ='没玩够'; 4 public function __clone(){ 5 $this->name = '快醒醒同志'; 6 echo '通过clone关键字得到对象的时候自动调用'; 7 } 8 9 } 10 $a = new A; 11 $a->name ='想我讲完做梦吧!'; 12 13 14 //取别名 15 $b = $a; 16 //var_dump($a); 17 //clone 得到对象 18 $obj = clone $a; 19 //var_dump($obj); 20 if($a===$obj){ 21 echo '等于'; 22 }else{ 23 echo '不等于';
自动加载
__autoload(类名) 当我们实例化一个对象发现类并不存在的时候回自动调用此函数进行补救。
这个函数会在PHP报错前被触发,未定义的类名会被当作参数传⼊。
按照以前,如果我们想使用一个函数或者类,使用inclue或者require来引入某个PHP文件。
有了自动加载,我们就可以更方便的引用某个类文件。
新建三个文件,分别是:
A.class.php
B.class.php
C.class.php
内容分别:
1 class A{ 2 } 3 class B{ 4 } 5 class C{ 6 }
新建index.php,内容如下:
<?php //include './A.class.php'; //include './B.class.php'; //include './C.class.php'; //当我们实例化一个对象的时候发现类不存在会自动调用函数来补救 function __autoload($className){ echo $className; //自动加载我们的内容 include './'.$className.'.class.php'; } $a = new A(); var_dump($a); $b = new B(); var_dump($b); $c = new C(); var_dump($c);
//注册一个给定的自动加载类函数 // spl_autoload_register('wangzhan'); function wangzhan($className){ include './'.$className.'.class.php'; } $a = new A; var_dump($a); $b = new B; var_dump($b); $c = new C; var_dump($c);

浙公网安备 33010602011771号