PHP物件導向中常用的關鍵字和魔術方法詳解

來源:互聯網
上載者:User
本篇文章主要介紹PHP物件導向中常用的關鍵字和魔術方法詳解,感興趣的朋友參考下,希望對大家有所協助。

PHP物件導向中常用的關鍵字

final

1.final不能修飾成員屬性(類中常量不是用這個關鍵字)

2.final只能修飾類和方法

作用:

使用final修飾的類不能被子類繼承

使用final修飾的方法不能被子類覆蓋

用來限制類不被繼承,方法不被覆蓋就使用final

<?php//final修飾的類不能被繼承final class Person{  var $name;  var $age;  var $sex;  function __construct($name,$age,$sex){    $this->name=$name;    $this->age=$age;    $this->sex=$sex;  }  function fun1(){    echo $this->name;  }}//Student類繼承類用final修飾的Person類,所以會報錯class Student extends Person{}$stu=new Student("zs",20,"nan");$stu->fun1();?>

static(靜態關鍵字)

1.使用static可以修飾成員屬性和成員方法,不能修飾類

2.用static修飾的成員屬性,可以被同一個類的所有對象共用

3.靜態資料是存在記憶體中的資料區段中(初始化靜態段)

4.靜態資料是在類被第一次載入時分配到記憶體中的,以後再用到類時就直接從資料區段中擷取

5.什麼是類被載入?只要在程式中使用到這個類(有這個類名出現)

6.靜態方法(static修飾的方法),不能訪問非靜態成員(在非靜態方法中可以訪問靜態成員)

因為非靜態成員,就必須用對象來訪問,訪問內部成員使用的就是$this,而靜態方法不用使用對象調用,也就沒有對象,$this也就不能代表對象,非靜態成員還必須使用對象

如果你確定一個方法中不使用非靜態成員,則可以將這個方法聲明為即靜態方法

注意:靜態成員都要使用類名去訪問,不要建立對象,不用對象訪問

類名::靜態成員

如果在類中使用靜態成員,可以使用self代表本類

const

1.它只能修飾成員屬性

2.類中聲明常量屬性使用const

3.訪問方式和static靜態成員屬性一樣(在類外部使用 類名::常量 在類內部使用 self::常量)

4.常量一定要在聲明的時候就給初值

<?php//定義一個類“人們”class Person{  protected $name;  protected $age;  protected $sex;  static $country="中國";  //聲明一個常量  const RUN="走";  //構造方法  function __construct($name,$age,$sex){    $this->name=$name;    $this->age=$age;    $this->sex=$sex;  }  function getCountry(){    //如果在類中使用靜態成員,可以使用self代表本類    return self::$country;  }  function say(){    echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>";  }  protected function eat(){    echo "吃飯!<br>";  }  function run(){    //在類的內部使用常量 self::常量    echo self::RUN."<br>";  }  //聲明靜態方法  static function hello(){    echo "你好<br>";  }}

PHP物件導向中常用的魔術方法

__call()

作用:調用對象中不存在的方法時,就會出現系統報錯,然後程式退出。

什麼時候自動調用:就會在調用一個對象中不存在的方法時就會自動調用

處理一些不存在的錯誤調用

這個方法需要兩個參數

<?php//定義一個類“人們”class Person{  protected $name;  protected $age;  protected $sex;  static $country="中國";  //聲明一個常量  const RUN="走";  //構造方法  function __construct($name,$age,$sex){    $this->name=$name;    $this->age=$age;    $this->sex=$sex;  }  function getCountry(){    //如果在類中使用靜態成員,可以使用self代表本類    return self::$country;  }  function say(){    echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>";  }  protected function eat(){    echo "吃飯!<br>";  }  function run(){    //在類的內部使用常量 self::常量    echo self::RUN."<br>";  }  //處理一些不存在的錯誤調用  //就會在調用一個對象中不存在的方法時就會自動調用  function __call($methodName,$args){    //$methodName調用不存在方法的方法名 $args裡面的參數    echo "你調用的方法{$methodName}(參數:";    print_r($args);    echo ")不存在<br>";  }  //聲明靜態方法  static function hello(){    echo "你好<br>";  }}$p=new Person("張三",20,"女");$p->test(10,20,30);$p->demo("aa","bb");$p->say();?>

__toString()

直接輸出對象引用的時候自動調用,用來快速擷取字串表示的最快捷的方法

<?php//定義一個類“人們”class Person{  protected $name;  protected $age;  protected $sex;  static $country="中國";  //聲明一個常量  const RUN="走";  //構造方法  function __construct($name,$age,$sex){    $this->name=$name;    $this->age=$age;    $this->sex=$sex;  }  function say(){    echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>";  }  function __toString(){    return self::$country."<br>{$this->name}<br>{$this->age}<br>{$this->sex}<br>".self::RUN;  }}$p=new Person("張三",21,"女");echo $p;?>

__clone()

複製對象使用clone()處理

原本(原來的對象)

複本(複製出來的對象)

__clone()就是在複製對象時自動調用的方法

只要一個對象一建立,就要有初始化的動作,和構造方法__constuct作用相似

在__clone()方法中的$this關鍵字代表的是複本的對象,$that代表原本對象

<?php//定義一個類“人們”class Person{  var $name;  protected $age;  protected $sex;  static $country="中國";  //聲明一個常量  const RUN="走";  //構造方法  function __construct($name,$age,$sex){    $this->name=$name;    $this->age=$age;    $this->sex=$sex;  }  function say(){    echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>";  }  function __clone(){    $this->name="王五";    $this->age=18;    $this->sex="男";  }  function __destruct(){    echo $this->name."<br>";  }}$p=new Person("張三",21,"女");$p->say();//這並不能叫做複製對象,因為在析構時只析構一次/*$p1=$p;$p1->name="李四";$p1->say();*/$p1= clone $p;$p1->say();?>

__autoload()

注意:其它的魔術方法都是在類中添加起作用,這是唯一一個不在類中添加的方法

只要在頁面中使用到一個類,只要用到類名,就會自動將這個類名傳給這個參數

<?phpfunction __autoload($className){  include "./test/".$className.".class.php";}  $o=new One;  $o->fun1();    $t=new Two;  $t->fun2();  $h=new Three;  $h->fun3();?>

test裡的檔案

one.class.php

<?phpclass One{  function fun1(){    echo "The Class One<br>";  }}?>

two.class.php

<?phpclass Two{  function fun2(){    echo "The Class Two<br>";  }}?>

three.class.php

<?phpclass Three{  function fun3(){    echo "The Class Three<br>";  }}?>

對象序列化(序列化):將一個對象轉為二進位串(對象是儲存在記憶體中的,容易釋放)

使用時間:

1.將對象長時間儲存在資料庫或檔案中時

2.將對象在多個PHP檔案中傳輸時

serialize(); 參數是一個對象,返回來的就是序列化後的二進位串

unserialize(); 參數就是對象的二進位串,返回來的就是新產生的對象

__sleep()

是在序列化時調用的方法

作用:就是可以將一個對象部分序列化

只要這個方法中返回一個數組,數組中有幾個成員屬性就序列化幾個成員屬性,如果不加這個方法,則所有成員都被序列化

__wakeup()

是在還原序列化時調用的方法

也是對象重新誕生的過程

<?php//定義一個類“人們”class Person{  var $name;  protected $age;  protected $sex;  static $country="中國";  //聲明一個常量  const RUN="走";  //構造方法  function __construct($name,$age,$sex){    $this->name=$name;    $this->age=$age;    $this->sex=$sex;  }  function say(){    echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>";  }  function __clone(){    $this->name="王五";    $this->age=18;    $this->sex="男";  }  //是在序列化時調用的方法,可以部分序列化對象  function __sleep(){    return array("name","age");  }  //是在還原序列化時調用的方法,也是對象重新誕生的過程。可以改變裡面的值  function __wakeup(){    $this->name="sanzhang";    $this->age=$this->age+1;  }  function __destruct(){  }}?>

read.php

<?php  require "11.php";    $str=file_get_contents("mess.txt");  $p=unserialize($str);  echo $p->say();?>

write.php

<?php  require "11.php";  $p=new Person("張三",18,"男");  $str=serialize($p);  file_put_contents("mess.txt",$str);?>

以上就是本文的全部內容,希望對大家的學習有所協助。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.