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);?>以上這篇詳談PHP面向對象中常用的關鍵字和魔術方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。
新聞熱點
疑難解答
圖片精選