溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP面向?qū)ο笾谐S玫年P(guān)鍵字和魔術(shù)方法的作用

發(fā)布時(shí)間:2021-09-03 21:58:36 來源:億速云 閱讀:121 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“PHP面向?qū)ο笾谐S玫年P(guān)鍵字和魔術(shù)方法的作用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

PHP面向?qū)ο笾谐S玫年P(guān)鍵字   

final

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

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類,所以會(huì)報(bào)錯(cuò)
class Student extends Person{
}

$stu=new Student("zs",20,"nan");

$stu->fun1();
?>

static(靜態(tài)關(guān)鍵字)

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

2.用static修飾的成員屬性,可以被同一個(gè)類的所有對(duì)象共享

3.靜態(tài)的數(shù)據(jù)是存在內(nèi)存中的數(shù)據(jù)段中(初始化靜態(tài)段)

4.靜態(tài)的數(shù)據(jù)是在類被第一次加載時(shí)分配到內(nèi)存中的,以后再用到類時(shí)就直接從數(shù)據(jù)段中獲取

5.什么是類被加載?只要在程序中使用到這個(gè)類(有這個(gè)類名出現(xiàn))

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

因?yàn)榉庆o態(tài)的成員,就必須用對(duì)象來訪問,訪問內(nèi)部成員使用的就是$this,而靜態(tài)方法不用使用對(duì)象調(diào)用,也就沒有對(duì)象,$this也就不能代表對(duì)象,非靜態(tài)的成員還必須使用對(duì)象

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

注意:靜態(tài)的成員都要使用類名去訪問,不要?jiǎng)?chuàng)建對(duì)象,不用對(duì)象訪問

類名::靜態(tài)成員

如果在類中使用靜態(tài)成員,可以使用self代表本類

const

1.它只能修飾成員屬性

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

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

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

<?php
//定義一個(gè)類“人們”
class Person{
  protected $name;
  protected $age;
  protected $sex;
  static $country="中國(guó)";
  //聲明一個(gè)常量
  const RUN="走";

  //構(gòu)造方法
  function __construct($name,$age,$sex){
    $this->name=$name;
    $this->age=$age;
    $this->sex=$sex;
  }

  function getCountry(){
    //如果在類中使用靜態(tài)成員,可以使用self代表本類
    return self::$country;
  }

  function say(){
    echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>";
  }

  protected function eat(){
    echo "吃飯!<br>";
  }

  function run(){
    //在類的內(nèi)部使用常量 self::常量
    echo self::RUN."<br>";
  }

  //聲明靜態(tài)的方法
  static function hello(){
    echo "你好<br>";
  }
}

PHP面向?qū)ο笾谐S玫哪g(shù)方法

__call()

作用:調(diào)用對(duì)象中不存在的方法時(shí),就會(huì)出現(xiàn)系統(tǒng)報(bào)錯(cuò),然后程序退出。

什么時(shí)候自動(dòng)調(diào)用:就會(huì)在調(diào)用一個(gè)對(duì)象中不存在的方法時(shí)就會(huì)自動(dòng)調(diào)用

處理一些不存在的錯(cuò)誤調(diào)用

這個(gè)方法需要兩個(gè)參數(shù)

<?php
//定義一個(gè)類“人們”
class Person{
  protected $name;
  protected $age;
  protected $sex;
  static $country="中國(guó)";
  //聲明一個(gè)常量
  const RUN="走";

  //構(gòu)造方法
  function __construct($name,$age,$sex){
    $this->name=$name;
    $this->age=$age;
    $this->sex=$sex;
  }

  function getCountry(){
    //如果在類中使用靜態(tài)成員,可以使用self代表本類
    return self::$country;
  }

  function say(){
    echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>";
  }

  protected function eat(){
    echo "吃飯!<br>";
  }

  function run(){
    //在類的內(nèi)部使用常量 self::常量
    echo self::RUN."<br>";
  }

  //處理一些不存在的錯(cuò)誤調(diào)用
  //就會(huì)在調(diào)用一個(gè)對(duì)象中不存在的方法時(shí)就會(huì)自動(dòng)調(diào)用
  function __call($methodName,$args){
    //$methodName調(diào)用不存在方法的方法名 $args里面的參數(shù)
    echo "你調(diào)用的方法{$methodName}(參數(shù):";
    print_r($args);
    echo ")不存在<br>";
  }

  //聲明靜態(tài)的方法
  static function hello(){
    echo "你好<br>";
  }
}

$p=new Person("張三",20,"女");

$p->test(10,20,30);
$p->demo("aa","bb");
$p->say();
?>

__toString()

直接輸出對(duì)象引用的時(shí)候自動(dòng)調(diào)用,用來快速獲取字符串表示的最快捷的方法

<?php
//定義一個(gè)類“人們”
class Person{
  protected $name;
  protected $age;
  protected $sex;
  static $country="中國(guó)";
  //聲明一個(gè)常量
  const RUN="走";

  //構(gòu)造方法
  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()

克隆對(duì)象使用clone()處理

原本(原來的對(duì)象)

復(fù)本(復(fù)制出來的對(duì)象)

__clone()就是在克隆對(duì)象時(shí)自動(dòng)調(diào)用的方法

只要一個(gè)對(duì)象一創(chuàng)建,就要有初始化的動(dòng)作,和構(gòu)造方法__constuct作用相似

在__clone()方法中的$this關(guān)鍵字代表的是復(fù)本的對(duì)象,$that代表原本對(duì)象

<?php
//定義一個(gè)類“人們”
class Person{
  var $name;
  protected $age;
  protected $sex;
  static $country="中國(guó)";
  //聲明一個(gè)常量
  const RUN="走";

  //構(gòu)造方法
  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();
//這并不能叫做克隆對(duì)象,因?yàn)樵谖鰳?gòu)時(shí)只析構(gòu)一次
/*$p1=$p;
$p1->name="李四";
$p1->say();*/

$p1= clone $p;
$p1->say();
?>

__autoload()

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

只要在頁(yè)面中使用到一個(gè)類,只要用到類名,就會(huì)自動(dòng)將這個(gè)類名傳給這個(gè)參數(shù)

<?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>";
  }
}
?>

對(duì)象串行化(序列化):將一個(gè)對(duì)象轉(zhuǎn)為二進(jìn)制串(對(duì)象是存儲(chǔ)在內(nèi)存中的,容易釋放)

使用時(shí)間:

1.將對(duì)象長(zhǎng)時(shí)間存儲(chǔ)在數(shù)據(jù)庫(kù)或文件中時(shí)

2.將對(duì)象在多個(gè)PHP文件中傳輸時(shí)

serialize();    參數(shù)是一個(gè)對(duì)象,返回來的就是串行化后的二進(jìn)制串

unserialize();  參數(shù)就是對(duì)象的二進(jìn)制串,返回來的就是新生成的對(duì)象

__sleep()

是在序列化時(shí)調(diào)用的方法

作用:就是可以將一個(gè)對(duì)象部分串行化

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

__wakeup()

是在反序列化時(shí)調(diào)用的方法

也是對(duì)象重新誕生的過程

<?php
//定義一個(gè)類“人們”
class Person{
  var $name;
  protected $age;
  protected $sex;
  static $country="中國(guó)";
  //聲明一個(gè)常量
  const RUN="走";

  //構(gòu)造方法
  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="男";
  }

  //是在序列化時(shí)調(diào)用的方法,可以部分串行化對(duì)象
  function __sleep(){
    return array("name","age");
  }

  //是在反序列化時(shí)調(diào)用的方法,也是對(duì)象重新誕生的過程??梢愿淖兝锩娴闹?
  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面向?qū)ο笾谐S玫年P(guān)鍵字和魔術(shù)方法的作用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI