php魔术方法简介-php教程

资源魔 76 0

后面的话

  php正在面向工具局部有不少相干的魔术办法,这些办法为面向工具完成提供了便当,本文将具体引见魔术办法

结构办法

  年夜少数类都有一种称为结构函数的非凡办法。当创立一个工具时,它将主动挪用结构函数,通罕用它执行一些有用的初始化义务

  结构函数的申明与其它操作的申明同样,只是其称号必需是两个下划线__construct( )。这是PHP5中的变动;PHP4的版本中,结构函数的称号必需与类名相反。为了向下兼容,假如一个类中不名为__construct( )的办法,PHP将搜寻一个与类名相反的办法

void __construct ([ mixed $args [, $... ]] )

  假如子类中界说了结构函数则没有会隐式挪用其父类的结构函数。要执行父类的结构函数,需求正在子类的结构函数中挪用 parent::__construct()。假如子类不界说结构函数则会好像一个一般的类办法同样从父类承继(如果不被界说为 private 的话)

<?phpclass BaseClass {
   function __construct() {
       print "In BaseClass constructor
";
   }
}class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();       print "In SubClass constructor
";
   }
}

析构办法

  与结构办法绝对的就是析构办法。析构办法是PHP5新增加的内容,正在PHP4中不析构办法。析构办法是正在工具被销毁以前主动挪用的办法,次要执行一些特定的操作,例如封闭文件,开释后果集等

  与结构办法相似,一个类的析构办法称号必需是两个下划线 __destruct( )。析构函数不克不及带有任何参数

<?phpclass MyDestructableClass {
   function __construct() {
       print "In constructor
";       $this->name = "MyDestructableClass";
   }   function __destruct() {
       print "Destroying " . $this->name . "
";
   }
}//In constructor Destroying MyDestructableClass$obj = new MyDestructableClass();?>

不成拜访属性

get()

  读取不成拜访属性(protected、private)时,__get()会被挪用,并将属性名以第一个参数(string)传进此办法中

public mixed __get ( string $name )

<?phpclass demo{
    protected $protected = 1;    public $public = 2;    private $private = 3;    function __get($name){
        echo "111{$name}111<br>";
    }
}$d1 = new demo;$d1->protected;//111protected111$d1->public;$d1->private;//111private111?>

set()

  正在给不成拜访属性(protected、private)赋值时,__set() 会被挪用,并将属性名以第一个参数(string),值作为第二参数(mixed)传进此办法中

public void __set ( string $name , mixed $value )
<?phpclass demo{
    protected $protected = 1;    public $public = 2;    private $private = 3;    function __set($name,$value){
        echo "0{$name}0{$value}<br>";
    }
}

isset()

  当对不成拜访属性(protected、private)挪用 isset() 或 empty() 时,__isset() 会被挪用

public bool __isset ( string $name )
<?phpclass demo{
    protected $protected = 1;    public $public = 2;    private $private = 3;    function __isset($name){
        echo "0{$name}0<br>";
    }
}

unset()

  当对不成拜访属性(protected、private)挪用unset()时,__unset()会被挪用

public void __unset ( string $name )

<?phpclass demo{
    protected $protected = 1;    public $public = 2;    private $private = 3;    function __unset($name){
        echo "0{$name}0<br>";
    }
}

工具复制

clone()

  正在工具克隆时会主动挪用clone()办法,这办法没有需求任何参数,能够经过该办法对克隆后的正本从新初始化

  clone()办法会主动蕴含this以及that两个工具的援用,this是正本工具的援用,that是本来工具的援用

<?php
    class Person{
        private $name;        private $sex;        private $age;        function __construct($name="",$sex="",$age=1){
            $this->name= $name;            $this->sex = $sex;            $this->age = $age;
        }        function __clone(){
            $this->name = $this->name."的正本";
        }        function say(){
            echo "我的名字:" .$this->name.",性别:".$this->sex.",春秋:".$this->age."<br>";
        }
    }

字符串

toString()

  __toString()办法用于一个类被当成字符串时应怎么回应,它是疾速猎取工具的字符串示意的最便捷的形式,是间接输入工具援用时主动挪用的办法

<?phpclass TestClass{
public $foo; public function __construct($foo)
{
$this->foo = $foo;
} public function __toString() {
return $this->foo;
}
}$class = new TestClass('Hello');echo $class;//Hello?>

工具没有存正在

call()

  正在工具中挪用一个不成拜访办法时,__call()会被挪用

callStatic()

  正在动态上下文中挪用一个不成拜访办法时,__callStatic()会被挪用

<?phpclass MethodTest {
    public function __call($name, $arguments) 
    {
        echo "Calling object method '$name' "
             . implode(', ', $arguments). "
";
    }    public static function __callStatic($name, $arguments) 
    {
        echo "Calling static method '$name' "
             . implode(', ', $arguments). "
";
    }
}

主动加载类

autoload()

  正在PHP5中,能够界说一个__autoload()函数,它会正在试图应用还没有被界说的类时主动挪用。经过挪用此函数,剧本引擎正在PHP犯错失败前有了最初一个机会加载所需的类

<?phpfunction __autoload($class_name) {
    require_once $class_name . '.php';
}

串行化

sleep()

  正在挪用serialize()函数将工具串行化时,反省类中能否存正在一个魔术办法 __sleep()。假如存正在,该办法会先被挪用,而后才执行序列化操作。此性能能够用于清算工具,并前往一个蕴含工具中一切应被序列化的变量称号的数组。假如该办法未前往任何内容,则 NULL 被序列化,并孕育发生一个 E_NOTICE 级此外谬误

  __sleep()函数没有需求承受任何参数,但需求前往一个数组,正在数组中蕴含需求串行化的属性。未被蕴含正在数组中的属性将正在串行化时被疏忽。假如不正在类中申明__sleep()办法,工具中的一切属性都将被串行化

wakeup()

  正在挪用unserialize()函数将工具反串行化工具时,则会主动挪用工具中的__wakeup()办法,用来正在二进制串从新组成一个工具时,为新工具中的成员属性从新初始化

  wakeup()常常用正在反序列化操作中,例如从新建设数据库衔接,或执行其它初始化操作

<?phpclass Connection {
    protected $link;    private $server, $username, $password, $db;  
    public function __construct($server, $username, $password, $db)
    {
        $this->server = $server;        $this->username = $username;        $this->password = $password;        $this->db = $db;        $this->connect();
    }    private function connect()
    {
        $this->link = mysql_connect($this->server, $this->username, $this->password);        mysql_select_db($this->db, $this->link);
    }    public function __sleep()
    {
        return array('server', 'username', 'password', 'db');
    }    public function __wakeup()
    {
        $this->connect();
    }
}?>

函数挪用

invoke()

  当测验考试以挪用函数的形式挪用一个工具时,__invoke()办法会被主动挪用

<?phpclass CallableClass {
    function __invoke($x) {
        var_dump($x);
    }
}

【增补】

set_state()

  当挪用var_export()导出类时,set_state()办法会被挪用,本办法的惟一参数是一个数组,此中蕴含按 array('property' => value, ...) 格局陈列的类属性

  [留意]var_export()前往对于通报给该函数的变量的构造信息,它以及var_dump()相似,没有同的是其前往的示意是非法的PHP代码,也就是说,var_export前往的代码,能够间接当做php代码赋给一个变量。 而这个变量就会获得以及被var_export同样的类型的值

<?phpclass A{
public $var1; public $var2; public static function __set_state($an_array)
{
$obj = new A; $obj->var1 = $an_array['var1']; $obj->var2 = $an_array['var2']; return $obj;
}
}

相干参考:资源魔

以上就是php魔术办法简介的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!