成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php.類與對象

scq000 / 3175人閱讀

摘要:接口可以使用常量,叫接口常量,和類的常量使用方法相同類可以同時繼承多個接口使用接口常量抽象類不能被實例化。繼承抽象類,子類必須實現(xiàn)父類中所有的抽象方法。

訪問控制

屬性和方法的訪問控制(可見標識):
public 任何地方
private 類自身
protected 類自身,自子類及自父類

this

this 可以理解為這個類的一個實例

self

self 代表類本身

__construct

實例化時就會自動執(zhí)行
public function __construct() {}

__destruct

當對象對銷毀時自動執(zhí)行
public function __destruct(){}

類常量

定義合不可改變

const ONE = 1
const TWO = self::ONE + 1;

可以在類外部調(diào)用
Class::Two

parent

parent代表父類
public function __construct(){ parent::__construct();}

final

final class Dad(){} 加到類定義前面表示Dad類不想被繼承

class Dad(){
    final public function run(){}  // 加到方法聲明前面,表示方法不想被子類重寫
}
namespace

namespace必須放在代碼文件的第一行
受命名空間影響的類型:類(包括抽像類,traits)、接口、函數(shù)和常量。
當沒有使用namespace關(guān)鍵字指定命名空間時,當前腳本是存在于全局命名空間的。用表示。Class1
類全在指定的命名空間去查找,沒找到則拋出錯誤。
函數(shù)與常量,在指定命名空間查找,沒找到則到全局命名空間查找,還沒打到則拋錯。

函數(shù)

ns1 s2fn()

常量

define定義的常量是全局的,不受命名空間影響。
const定義的常量受命名空間影響。

namespace ns1
s2;
const ONE = 1;

echo ns1
s2ONE;
use 導(dǎo)入類

use導(dǎo)入命名空間下的類
use ns1 s2class1;

as重命名導(dǎo)入的類
use ns1 s2class1 as class2;

導(dǎo)入函數(shù)

use function ns1 s2fn as fn1;

導(dǎo)入常量

use const ns1 s2ONE;

自動加載 __autoload
function __autoload($className){ require $className . ".php";}
spl_autoload_register 傳匿名函數(shù)
spl_autoload_register(function($className){ require $className . ".php"; });
傳函數(shù)名
function test($className){ require $className . ".php"; }
spl_autoload_register("test");
傳類
class Momo
{
   function autoload($className)
   {
           require $className . ".php";
   }
}

spl_autoload_register([new Momo, "autoload"]);
static

聲明靜態(tài)屬性和靜態(tài)方法,不經(jīng)過實例化,通過類名即可調(diào)用。

class Person()
{
    public static $hand = "手";
   
   public static function run()
   {
           echo "running...";
   }
}

echo Person::$hand;
Person::run();

類內(nèi)部調(diào)用靜態(tài)屬性和靜態(tài)方法用self關(guān)鍵字

echo self::$hand; self::run();

調(diào)用父類的靜態(tài)屬性和靜態(tài)方法用parent關(guān)鍵字

echo parent::$hand; parent::run();

后期靜態(tài)綁定
class A
{
    public static function who()
   {
           echo "A類的who方法";
   }
   
   public static function test1()
   {
           self::who();
   }
   
   public static function test2()
   {
           static::who();
   }
}

class B extends A
{
    public static function who()
    {
        echo "B類的who方法";
    }
}

B::test1();  // test1內(nèi)部用的self,調(diào)用的是自身(A類)的靜態(tài)方法
B::test2();  // 后期綁定。內(nèi)部用static,根據(jù)后期的調(diào)用環(huán)境確定,調(diào)用的是B類的靜態(tài)方法
魔術(shù)方法 __set
class Test
{
    private $name = "";
    
    public function __set($var, $val)
    {
        //     對$val進行數(shù)據(jù)處理
        $this->$var = $val;
    }
}

$test = new Test();
$test->name = "tom";    // 賦值tom
__get
class Test
{
    private $name = "jack";
    public function __get($var)
    {
        return $this->$var;
    }
}

$test = new Test();
echo $test->name;    // jack
__isset

用于檢測私有屬性是否存在

class Test
{
    private $name = "mary";
    
    public function __isset($var)
    {
        return isset($this->$var);
    }
}
$test = new Test();
var_dump($test->name);    // 如果不設(shè)置__isset,返回false,設(shè)置后返回true
__unset

用于刪除私有屬性

class Test
{
    private $name = "Levi";
   public function __unset($var)
   {
           unset()
   }
}
$test = new Test;
unset($test->name);        // 會觸發(fā)__unset
__call

避免調(diào)用一個不存在的方法時產(chǎn)生錯誤,當調(diào)用的方法不存在時,__call方法會自動調(diào)用

class Test
{
    public function __call($fn_name, $fn_arguments)
    {
        echo $fn_name;
        print_r($fn_arguments);
    }
}

$test = new Test();
$test->go(1, "ok");        // 自動調(diào)用`__call`方法,打印出函數(shù)名和參數(shù)數(shù)組
__callStatic

__call類似
避免調(diào)用一個不存在的靜態(tài)方法

class Test
{
    public static function __callStatic($fn_name, $fn_arguments)
    {
        echo $fn_name;
        print_r($fn_arguments);
    }
}

// `__callStatic` 必須聲明為靜態(tài)方法
Test::go(1, "ok");
__invoke

當對象以函數(shù)的形式調(diào)用的時候,自動調(diào)用__invoke方法

class Test
{
    public function __invoke($args)
    {
        return $args;
    }
}
$test = new Test();
$test("go.....");    // 運行__invoke
__toString

當打印對象是會調(diào)用__toString方法

class Test
{
    public function __toString()
    {
        return "Hello world!";
    }
}

$test = new Test;
echo $test;        // 輸出 Hello world!
對象復(fù)制 淺拷貝

比較省內(nèi)存,對象的拷貝默認是淺拷貝。

$a = new Test();
$b = $a;    // 淺拷貝。傳址。改變$b。$a也會改變。

對象的復(fù)制是淺拷貝的。傳址。
普通變量的拷貝是深拷貝的。傳值。

深拷貝
$a = new Test();
$b = clone $a;    // 深拷貝。改變$b,不會改變$a。
__clone

當使用clone關(guān)鍵字時,自動調(diào)用__clone方法

class Test
{
    public $obj = null;
    public function __clone()
    {
        $this->obj = clone $this->obj;
    }
}
class Person
{
    public $sex = 0;
}
$a = new Test;
$a->obj = new Person;
$b = clone $a;        // 觸發(fā)`__clone` 對obj進行深拷貝
$b->obj->sex = 1;    // $b中的obj對象改變了。而$a中的obj對象沒變。
類型約束
class A
{
    public function go()
    {
        echo "go .....";
    }
}
function test(A $a) {
    $a->go();
}
test(new A());
Trait

單繼承語言PHP的代碼復(fù)用機制。

Trait Bt
{
    public function atest()
    {
        echo "Hello ";
    }
    
    public function btest()
    {
        echo "world";
    }
    
    public function ab()
    {
        $this->atest();
        $this->btest();
    }
}

class Test
{
    use Bt;        // 使用Bt Trait,便擁有了Bt所有的方法
}

$test = new Test;
$test->ab();

繼承多個Trait

Trait A
{
    public $name = "tom";
    public function a()
    {
        echo "Hello ";
    }
}
Trait B
{
    public function b()
    {
        echo "world ";
    }
}

class Test
{
    use A,B;
    public function c()
    {
        echo $this->name;
    }
}

$test = new Test;
$test->a();
$test->b();
$test->c();        // Hello world tom

Trait 支持嵌套

Trait A{}
Trait B{}
Trait C
{
    use A,B;
}
Class Test
{
    use C;
}
interface

接口是類的模板。在接口中只定義需要實現(xiàn)的空方法,這些方法在接口中不做具體實現(xiàn)。
接口是不能被實例化的。

Interface Person
{
    public function eat();
   public function sleep();
}

class man implements Person
{
    public function eat()
    {
        echo "eating...";
    }
    
    public function sleep()
    {
        echo "sleeping...";
    }
}

class L
{
    public static function factory(Person $user)    // 用接口作類型約束
    {
        return $user;
    }
}

$user = L::factory(new Man());
$user->eat();
$user->sleep();

接口可以繼承接口。
接口可以繼承多個接口。
接口可以使用常量,叫接口常量,和類的常量使用方法相同

Interface Ia
{
    const ONE = 1;
    public function eat();
}

Interface Ib
{
    public function sleep();
}

Interface AB extends Ia,Ib
{}

// class Test implements Ia,Ib        類可以同時繼承多個接口
class Test implements AB
{
    public function eat()
    {
        echo "eating...";
    }
    
    public function sleep()
    {
        echo "sleeping...";
    }
}

$test = new Test;
$test->eat();
$test->sleep();
echo Ia::ONE;    // 使用接口常量
abstract

抽象類不能被實例化。
如果至少有一個方法被聲明為抽象的,那么這個類必須被聲明為抽象的。
抽象方法只能聲明,不能有具體功能實現(xiàn)。
抽象類可以有被實現(xiàn)的的方法。

繼承抽象類,子類必須實現(xiàn)父類中所有的抽象方法。
這些方法的訪問控制必須和父類一樣,或者更寬松,不能比父類更嚴格。
方法的調(diào)用方式也必須匹配。類型和參數(shù)數(shù)量必須一致,但子類可以定義父類中不存在的可選參數(shù)。

abstract AB
{
    public function run()
    {
        echo "running...";
    }
    
    abstract public function eat();
    abstract public function sleep();
}

class Test extends AB
{
    public function eat()
    {
        echo "eating...";
    }
    
    public function sleep($time = "21:00 PM")    // 可以定義父類方法中不存在的可選參數(shù)
    {
        echo "sleep @ " . $time;
    }
}
單例模式

只能被實例化一次,節(jié)省內(nèi)存空間

class Test
{
    private static $instance = null;
   private function __constrct()
   {}
   private function __clone()
   {}
   public static function getInstance()
   {
           if (!(self::instance instanceof self)) {
              self::instance = new self();          
        }
           return self::instance;
   }
}

$test = Test::getInstance();    // 多次調(diào)用也只是實例化一次
工廠模式
Interface CacheI
{
    public function set($key, $value);
   public function get($key);
   public function delete($key);
}
class Memcache implements CacheI
{
    public function set($key, $value){}
   public function get($key){}
   public function delete($ke){}
}
class Redis implements CacheI
{
    public function set($key, $value){}
   public function get($key){}
   public function delete($ke){}
}
class Cache
{
    public static function factory()
    {
        return new Memcache();    // 這里可以是繼承了CacheI接口的任何類,比如Redis
    }
}
$cache = Cache::factory();
$cache->set("name", "tom");
$cache->get("name");
$cache->delete("name");

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29698.html

相關(guān)文章

  • php面向對象詳解

    摘要:前言自從進入版本以來,開始全面地支持面向?qū)ο缶幊?。好了,進入正題,面向?qū)ο蟮娜筇匦苑謩e是封裝性,繼承性以及多態(tài)性,使用面向?qū)ο箝_發(fā),讓我們的程序可維護以及擴展性大大提高。 showImg(https://segmentfault.com/img/remote/1460000012257579?w=1920&h=1080); 前言 自從php進入5.0版本以來,PHP開始全面地支持面向...

    xingpingz 評論0 收藏0
  • php易錯筆記-類與對象,命名空間

    摘要:類與對象基本概念如果在之后跟著的是一個包含有類名的字符串,則該類的一個實例被創(chuàng)建。如果該類屬于一個名字空間,則必須使用其完整名稱。如果一個類被聲明為,則不能被繼承。命名空間通過關(guān)鍵字來聲明。 類與對象 基本概念 new:如果在 new 之后跟著的是一個包含有類名的字符串,則該類的一個實例被創(chuàng)建。如果該類屬于一個名字空間,則必須使用其完整名稱。 Example #3 創(chuàng)建一個實例 ...

    MartinHan 評論0 收藏0
  • 【modernPHP專題(4)】抽象類與接口

    摘要:抽象類支持抽象類和抽象方法。接口是一種特殊的抽象類,這種抽象類中只包含抽象方法和靜態(tài)常量。對抽象類的使用是通過關(guān)鍵字。抽象類中可以聲明各種類型成員變量,實現(xiàn)數(shù)據(jù)的封裝。一個類可以同時實現(xiàn)多個接口,但一個類只能繼承于一個抽象類。 抽象類 php5支持抽象類和抽象方法。類前加 abstract, 此類就成為抽象類,無法被實例化,此類天生就是用來被繼承的,給子類提供了一個類的模板;類方法前加...

    Keven 評論0 收藏0
  • PHP面試??純?nèi)容之面向對象(3)

    摘要:面試專欄正式起更,每周一三五更新,提供最好最優(yōu)質(zhì)的面試內(nèi)容。繼上一篇面試常考內(nèi)容之面向?qū)ο蟀l(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄C嫦驅(qū)ο蟮闹饕卣鳛榉庋b繼承多態(tài)。為了提高內(nèi)聚性減少引起變化,單一原則是低耦合高內(nèi)聚的面向原則上的引申。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。繼上一篇PHP面試??純?nèi)容之面向?qū)ο螅?)發(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄?...

    xfee 評論0 收藏0
  • PHP代碼優(yōu)化— getter 和 setter

    摘要:同時也可以用來實現(xiàn)委托,委托是指一個對象轉(zhuǎn)發(fā)一個請求給另一個對象,把請求的處理委托給另一個對象。但在繼承是父類與子類的關(guān)系是固定的,而使用委托可以在運行時改變使用的對象,委托比繼承具有更大的靈活性。 PHP中要實現(xiàn)類似于Java中的getter和setter有多種方法,比較常用的有: 直接箭頭->調(diào)用屬性(最常用),不管有沒有聲明這個屬性,都可以使用,但會報Notice級別的錯誤 $d...

    hzc 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<