亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

前端學PHP之面向對象系列第二篇魔術方法

2020-03-22 19:50:55
字體:
來源:轉載
供稿:網友

  • 前面的話

      php在html' target='_blank'>面向對象部分有很多相關的魔術方法,這些方法為面向對象實現提供了便利,本文將詳細介紹魔術方法

    構造方法

      大多數類都有一種稱為構造函數的特殊方法。當創建一個對象時,它將自動調用構造函數,通常用它執行一些有用的初始化任務

      構造函數的聲明與其它操作的聲明一樣,只是其名稱必須是兩個下劃線__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';   }}class OtherSubClass extends BaseClass {}// In BaseClass constructor$obj = new BaseClass();// In BaseClass constructor// In SubClass constructor$obj = new SubClass();// In BaseClass constructor$obj = new OtherSubClass();?>

    析構方法

      與構造方法相對的就是析構方法。析構方法是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>';    }}$d1 = new demo;$d1->protected = '1';//0protected01$d1->public = '2';$d1->private = '3';//0private03?>

    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>';    }}$d1 = new demo;empty($d1->protected);//0protected0empty($d1->public);empty($d1->private);//0private0?>

    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>';    }}$d1 = new demo;unset($d1->protected);//0protected0unset($d1->public);unset($d1->private);//0private0?>

    對象復制

    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>';        }    }    $p1 = new Person('張三','男','20');    $p2 = clone $p1;    $p1->say();//我的名字:張三,性別:男,年齡:20    $p2->say();//我的名字:張三的副本,性別:男,年齡:20?>

    字符串

    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). '';    }}$obj = new MethodTest;//Calling object method 'runTest' in object context$obj->runTest('in object context');//Calling static method 'runTest' in static contextMethodTest::runTest('in static context');  ?>

    自動加載類

    autoload()

      在PHP5中,可以定義一個__autoload()函數,它會在試圖使用尚未被定義的類時自動調用。通過調用此函數,腳本引擎在PHP出錯失敗前有了最后一個機會加載所需的類

    <?phpfunction __autoload($class_name) {    require_once $class_name . '.php';}$obj  = new MyClass1();$obj2 = new MyClass2();?>

    串行化

    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);    }}$obj = new CallableClass;$obj(5);//int(5)var_dump(is_callable($obj));//bool(true)?>

    【補充】

    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;    }}$a = new A;$a->var1 = 5;$a->var2 = 'foo';eval('$b = ' . var_export($a, true) . ';'); /*object(A)[2]  public 'var1' => int 5  public 'var2' => string 'foo' (length=3) */var_dump($b);?>
    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    精品综合久久久久久97| 另类美女黄大片| 日韩在线国产精品| 91成人性视频| 日日骚av一区| 欧美一区二粉嫩精品国产一线天| 精品无码久久久久久国产| 色综合视频网站| 欧美综合一区第一页| 午夜精品一区二区三区在线视| 91av在线不卡| 色综合久久中文字幕综合网小说| 国产精品扒开腿做爽爽爽的视频| 日本久久亚洲电影| 欧美日韩国产精品专区| 一区二区亚洲精品国产| 亚洲一区二区三区在线免费观看| 国产欧洲精品视频| 亚洲美女动态图120秒| 色偷偷偷综合中文字幕;dd| 欧美精品在线第一页| 国产成人精品视频在线| 国产精品免费网站| 亚洲国产精品99| 国产精品自拍偷拍| 欧美性视频在线| 日本91av在线播放| 亚洲精品国精品久久99热一| 成人网在线免费看| 亚洲欧美国产高清va在线播| 久久精品国产欧美激情| 欧美亚洲另类制服自拍| 久久精品国产亚洲| 国产精品狼人色视频一区| 成人日韩在线电影| 亚洲精品电影在线观看| 国内精品在线一区| 91成人福利在线| 欧美老少做受xxxx高潮| 欧美成人激情在线| 亚洲国产精品一区二区三区| 91久久夜色精品国产网站| 国产精品都在这里| 国产精品日韩欧美| 欧美成人性生活| www.日韩视频| 欧美激情第99页| 日韩中文字幕在线视频| 亚洲va码欧洲m码| 精品美女永久免费视频| 国产精品免费一区| 久久天天躁狠狠躁夜夜躁| 亚洲欧美激情视频| 久久久久久久久久久国产| 91精品国产综合久久香蕉最新版| 久久天天躁狠狠躁夜夜av| 91精品久久久久久久久久久久久久| 欧美成人性生活| 97在线视频免费播放| 欧美重口另类videos人妖| 亚洲精品98久久久久久中文字幕| 久久久伊人欧美| 一区二区三区国产在线观看| 一本色道久久88综合亚洲精品ⅰ| 亚洲图片制服诱惑| www.亚洲一二| 国产97在线播放| 丰满岳妇乱一区二区三区| 97成人精品区在线播放| 亚洲精品网站在线播放gif| 国产精品白丝jk喷水视频一区| 亚洲女人天堂网| 尤物精品国产第一福利三区| 国产亚洲一区二区精品| 国产精品入口夜色视频大尺度| 国产精品入口免费视频一| 日韩中文在线中文网三级| 日韩高清电影好看的电视剧电影| 91香蕉亚洲精品| 欧美综合国产精品久久丁香| 国产成人综合一区二区三区| 欧美成人免费在线观看| 国产精品福利网| 在线看欧美日韩| 成人午夜一级二级三级| 精品一区精品二区| 国产精品欧美激情在线播放| 亚洲精品自产拍| 欧美精品999| 97精品欧美一区二区三区| 久久久亚洲欧洲日产国码aⅴ| 国产99在线|中文| 中文字幕精品影院| 亚洲最大成人免费视频| 国产精品91久久久| 日韩欧美精品网站| 性亚洲最疯狂xxxx高清| 久久电影一区二区| 久久久99免费视频| 亚洲欧美日韩中文在线制服| 精品久久久久久久久久久久久久| 欧美黑人又粗大| 国产精品久久久久久久久| 在线看片第一页欧美| 国产999精品久久久| 一道本无吗dⅴd在线播放一区| 久久久亚洲网站| 欧美成人黄色小视频| 日韩大陆毛片av| 日韩高清a**址| 亚洲欧美国产va在线影院| 国产精品成人v| 欧美肥臀大乳一区二区免费视频| 欧美人交a欧美精品| 久久久国产精彩视频美女艺术照福利| 国外成人在线播放| 一个人看的www久久| 国产欧美一区二区白浆黑人| 国产精品久久久久99| 久久全国免费视频| 91精品国产高清自在线看超| 亚洲2020天天堂在线观看| 91影院在线免费观看视频| 国产日韩在线亚洲字幕中文| 亚洲男人天堂久| 国产成人a亚洲精品| 久久露脸国产精品| 国产成人亚洲综合91| 精品久久久精品| 这里只有精品视频| 久久精品久久久久久国产 免费| 九九热精品视频国产| 日本精品va在线观看| 欧美国产精品va在线观看| 欧美午夜激情小视频| 精品亚洲精品福利线在观看| 欧美国产日韩一区二区三区| 欧美午夜丰满在线18影院| 国产精品极品美女在线观看免费| 亚洲国产中文字幕久久网| 97av在线视频免费播放| 国产精品美女午夜av| 国产精品高清网站| xvideos成人免费中文版| 亚洲国产成人在线视频| 亚洲成成品网站| 色偷偷88888欧美精品久久久| 乱亲女秽乱长久久久| 91精品国产色综合久久不卡98| 欧美日韩精品在线视频| 国模精品视频一区二区| 久久激情五月丁香伊人| 亚洲字幕一区二区| 久久天天躁日日躁| 国产亚洲精品综合一区91| 亚洲аv电影天堂网| 色哟哟网站入口亚洲精品| 7m第一福利500精品视频| 91国偷自产一区二区三区的观看方式| 国产成人自拍视频在线观看| 91欧美精品成人综合在线观看| 精品视频www| 456亚洲影院| 韩日精品中文字幕|