首頁  >  文章  >  後端開發  >  php 物件導向中常用的關鍵字和魔術方法詳解

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

怪我咯
怪我咯原創
2017-07-10 11:46:241772瀏覽

1.construct()

實例化物件是被自動呼叫。當construct和以類別名為函數名的函數 同時存在時呼叫construct,另一個不背呼叫。

類別名為函數名的函式為老版的建構子。

2.destruct()

當刪除一個物件或一個物件操作結束是被呼叫。

3.call()

物件呼叫某個方法。若方法不存在,這呼叫call 這個方法

4.get()

讀取一個物件屬性,如果物件屬性是私有的會呼叫它

#5. set()

給一個物件屬性賦值時如果屬性是私有的會呼叫它

#6.toString()

列印一個物件的時候會被呼叫。

7.clone()

複製物件時被調用,如:$a=new test(); $a1=clone $a;

8.sleep( )

Serialize 之前被調用,若物件比較大,想刪減一點東西在序列化可以用它。

9.wakeup()

Unserialize時被調用,做些物件的初始化工作。

10.isset()

偵測一個物件的屬性是否存在如果 偵測的屬性是私有的時候會被呼叫。

11.unset()

刪除一個物件屬性時如果刪除的物件屬性是私有的會被呼叫

12.set_state()

呼叫var_export時,被呼叫。用set_state的回傳值做為var_export的回傳值。

13.autoload()

當實例化一個物件時,如果對應的類別不存在,則該方法被掉用。


下面小編就為大家帶來一篇詳談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()

注意:其它的魔术方法都是在类中添加起作用,这是唯一一个不在类中添加的方法

只要在页面中使用到一个类,只要用到类名,就会自动将这个类名传给这个参数

<?php
function 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

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

two.class.php

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

three.class.php

<?php
class 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 物件導向中常用的關鍵字和魔術方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn