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

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

墨辰丷
墨辰丷原創
2018-05-26 11:07:32999瀏覽

本篇文章主要介紹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中关键字interface和implements图文详解

详细讲解php 类、方法关键字教程

了解SQL INNER JOIN 关键字的相关知识

以上是PHP物件導向中常用的關鍵字和魔術方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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