国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

php易錯(cuò)筆記-類與對(duì)象,命名空間

MartinHan / 1608人閱讀

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

類與對(duì)象 基本概念
new:如果在 new 之后跟著的是一個(gè)包含有類名的字符串,則該類的一個(gè)實(shí)例被創(chuàng)建。如果該類屬于一個(gè)名字空間,則必須使用其完整名稱

Example #3 創(chuàng)建一個(gè)實(shí)例


在類定義內(nèi)部,可以用 new selfnew parent 創(chuàng)建新對(duì)象。

PHP 5.3.0 引進(jìn)了兩個(gè)新方法來創(chuàng)建一個(gè)對(duì)象的實(shí)例:


自 PHP 5.5 起,關(guān)鍵詞 class 也可用于類名的解析:ClassName::class

當(dāng)把一個(gè)對(duì)象已經(jīng)創(chuàng)建的實(shí)例賦給一個(gè)新變量時(shí),新變量會(huì)訪問同一個(gè)實(shí)例,就和用該對(duì)象賦值一樣。此行為和給函數(shù)傳遞入實(shí)例時(shí)一樣。可以用克隆給一個(gè)已創(chuàng)建的對(duì)象建立一個(gè)新實(shí)例。

foo = "qux";
var_dump( $objectVar );
var_dump( $reference );
var_dump( $assignment );
var_dump( $cloneObj );

echo "--------------------", PHP_EOL;

$objectVar = null;
var_dump($objectVar);
var_dump($reference);
var_dump($assignment);
var_dump($cloneObj);

/*
Result:

object(Object)#1 (1) {
  ["foo"]=>
  string(3) "qux"
}
object(Object)#1 (1) {
  ["foo"]=>
  string(3) "qux"
}
object(Object)#1 (1) {
  ["foo"]=>
  string(3) "qux"
}
object(Object)#2 (1) {
  ["foo"]=>
  string(3) "bar"
}
--------------------
NULL
NULL
object(Object)#1 (1) {
  ["foo"]=>
  string(3) "qux"
}
object(Object)#2 (1) {
  ["foo"]=>
  string(3) "bar"
}
*/
類的自動(dòng)加載

spl_autoload_register() 函數(shù)可以注冊(cè)任意數(shù)量的自動(dòng)加載器,當(dāng)使用尚未被定義的類(class)和接口(interface)時(shí)自動(dòng)去加載。通過注冊(cè)自動(dòng)加載器,腳本引擎在 PHP 出錯(cuò)失敗前有了最后一個(gè)機(jī)會(huì)加載所需的類。

盡管 __autoload() 函數(shù)也能自動(dòng)加載類和接口,但更建議使用 spl_autoload_register() 函數(shù)。 spl_autoload_register() 提供了一種更加靈活的方式來實(shí)現(xiàn)類的自動(dòng)加載(同一個(gè)應(yīng)用中,可以支持任意數(shù)量的加載器,比如第三方庫中的)。因此,不再建議使用 __autoload() 函數(shù),在以后的版本中它可能被棄用。

Example #1 自動(dòng)加載示例

本例嘗試分別從 MyClass1.php 和 MyClass2.php 文件中加載 MyClass1 和 MyClass2 類。


構(gòu)造函數(shù)和析構(gòu)函數(shù)
Note: 如果子類中定義了構(gòu)造函數(shù)則不會(huì)隱式調(diào)用其父類的構(gòu)造函數(shù)。要執(zhí)行父類的構(gòu)造函數(shù),需要在子類的構(gòu)造函數(shù)中調(diào)用 parent::__construct()。如果子類沒有定義構(gòu)造函數(shù)則會(huì)如同一個(gè)普通的類方法一樣從父類繼承(假如沒有被定義為 private 的話)。

和構(gòu)造函數(shù)一樣,父類的析構(gòu)函數(shù)不會(huì)被引擎暗中調(diào)用。要執(zhí)行父類的析構(gòu)函數(shù),必須在子類的析構(gòu)函數(shù)體中顯式調(diào)用 parent::__destruct()。此外也和構(gòu)造函數(shù)一樣,子類如果自己沒有定義析構(gòu)函數(shù)則會(huì)繼承父類的。

析構(gòu)函數(shù)即使在使用 exit() 終止腳本運(yùn)行時(shí)也會(huì)被調(diào)用。在析構(gòu)函數(shù)中調(diào)用 exit() 將會(huì)中止其余關(guān)閉操作的運(yùn)行。

訪問控制(可見性)

類屬性必須定義為公有受保護(hù)私有之一。如果用 var 定義,則被視為公有。

類中的方法可以被定義為公有私有受保護(hù)。如果沒有設(shè)置這些關(guān)鍵字,則該方法默認(rèn)為公有

同一個(gè)類的對(duì)象即使不是同一個(gè)實(shí)例也可以互相訪問對(duì)方的私有與受保護(hù)成員。這是由于在這些對(duì)象的內(nèi)部具體實(shí)現(xiàn)的細(xì)節(jié)都是已知的。

Example #3 訪問同一個(gè)對(duì)象類型的私有成員

foo = $foo;
    }

    private function bar()
    {
        echo "Accessed the private method.";
    }

    public function baz(Test $other)
    {
        // We can change the private property:
        $other->foo = "hello";
        var_dump($other->foo);

        // We can also call the private method:
        $other->bar();
    }
}

$test = new Test("test");

$test->baz(new Test("other"));

//string(5) "hello"
//Accessed the private method.
?>

繼承和訪問控制:

overridden(); 
    } 
    private function overridden() { 
        echo "base"; 
    } 
} 

class child extends base { 
    private function overridden() { 
        echo "child"; 
    } 
} 

$test = new child(); 
$test->inherited(); 
?> 

Output will be "base". 

If you want the inherited methods to use overridden functionality in extended classes but public sounds too loose, use protected. That"s what it is for:) 

A sample that works as intended: 

overridden(); 
    } 
    protected function overridden() { 
        echo "base"; 
    } 
} 

class child extends base { 
    protected function overridden() { 
        echo "child"; 
    } 
} 

$test = new child(); 
$test->inherited(); 
?> 
Output will be "child".
范圍解析操作符 (::)

范圍解析操作符(也可稱作 Paamayim Nekudotayim)或者更簡(jiǎn)單地說是一對(duì)冒號(hào),可以用于訪問靜態(tài)成員類常量,還可以用于覆蓋類中的屬性和方法

訪問靜態(tài)變量,靜態(tài)方法,常量:


Example #3 調(diào)用父類的方法

myFunc();
?>
Static(靜態(tài))關(guān)鍵字
用 static 關(guān)鍵字來定義靜態(tài)方法屬性。static 也可用于定義靜態(tài)變量以及后期靜態(tài)綁定

聲明類屬性或方法為靜態(tài),就可以不實(shí)例化類而直接訪問。靜態(tài)屬性不能通過一個(gè)類已實(shí)例化的對(duì)象來訪問(但靜態(tài)方法可以)

抽象類

繼承一個(gè)抽象類的時(shí)候:
1.子類必須定義父類中的所有抽象方法
2.這些方法的訪問控制必須和父類中一樣(或者更為寬松)。例如某個(gè)抽象方法被聲明為受保護(hù)的,那么子類中實(shí)現(xiàn)的方法就應(yīng)該聲明為受保護(hù)的或者公有的,而不能定義為私有的;
3.方法的調(diào)用方式必須匹配,即類型和所需參數(shù)數(shù)量必須一致。例如,子類定義了一個(gè)可選參數(shù),而父類抽象方法的聲明里沒有,則兩者的聲明并無沖突。 這也適用于 PHP 5.4 起的構(gòu)造函數(shù)。在 PHP 5.4 之前的構(gòu)造函數(shù)聲明可以不一樣的;

對(duì)象接口

接口中定義的所有方法都必須是公有,這是接口的特性。
實(shí)現(xiàn)類必須實(shí)現(xiàn)接口中定義的所有方法
可以實(shí)現(xiàn)多個(gè)接口,用逗號(hào)來分隔多個(gè)接口的名稱。
實(shí)現(xiàn)多個(gè)接口時(shí),接口中的方法不能有重名
類要實(shí)現(xiàn)接口,必須使用和接口中所定義的方法完全一致的方式
接口中也可以定義常量。接口常量和類常量的使用完全相同,但是不能被子類或子接口所覆蓋

Trait

自 PHP 5.4.0 起,PHP 實(shí)現(xiàn)了一種代碼復(fù)用的方法,稱為 trait

Trait 是為類似 PHP 的單繼承語言而準(zhǔn)備的一種代碼復(fù)用機(jī)制。Trait 為了減少單繼承語言的限制,使開發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨(dú)立的類中復(fù)用 method。Trait 和 Class 組合的語義定義了一種減少復(fù)雜性的方式,避免傳統(tǒng)多繼承和 Mixin 類相關(guān)典型問題。

Trait 和 Class 相似,但僅僅旨在用細(xì)粒度和一致的方式來組合功能。 無法通過 trait 自身來實(shí)例化。它為傳統(tǒng)繼承增加了水平特性的組合;也就是說,應(yīng)用的幾個(gè) Class 之間不需要繼承。

優(yōu)先級(jí):從基類繼承的成員會(huì)被 trait 插入的成員所覆蓋。優(yōu)先順序是來自當(dāng)前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。

sayHello();//Hello World!
?>

多個(gè) trait:通過逗號(hào)分隔,在 use 聲明列出多個(gè) trait,可以都插入到一個(gè)類中。

沖突的解決:為了解決多個(gè) trait 在同一個(gè)類中的命名沖突,需要使用 insteadof 操作符來明確指定使用沖突方法中的哪一個(gè)


修改方法的訪問控制使用 as 語法還可以用來調(diào)整方法的訪問控制。


trait 來組成 trait在 trait 定義時(shí)通過使用一個(gè)或多個(gè) trait,能夠組合其它 trait 中的部分或全部成員。

sayHello();
$o->sayWorld();
?>

Trait 的抽象成員為了對(duì)使用的類施加強(qiáng)制要求,trait 支持抽象方法的使用。

getWorld();
    }
    abstract public function getWorld();
}

class MyHelloWorld {
    private $world;
    use Hello;
    public function getWorld() {
        return $this->world;
    }
    public function setWorld($val) {
        $this->world = $val;
    }
}
?>

Trait 的靜態(tài)成員Traits 可以被靜態(tài)成員靜態(tài)方法定義。



Example using trait:

屬性Trait 同樣可以定義屬性。
Trait 定義了一個(gè)屬性后,類就不能定義同樣名稱的屬性,否則會(huì)產(chǎn)生 fatal error。 有種情況例外:屬性是兼容的(同樣的訪問可見度、初始默認(rèn)值)。 在 PHP 7.0 之前,屬性是兼容的,則會(huì)有 E_STRICT 的提醒。

Example #12 解決沖突


重載(術(shù)語濫用)

PHP所提供的"重載"(overloading)是指動(dòng)態(tài)地"創(chuàng)建"類屬性和方法。我們是通過魔術(shù)方法(magic methods)來實(shí)現(xiàn)的。

當(dāng)調(diào)用當(dāng)前環(huán)境下未定義或不可見的類屬性或方法時(shí),重載方法會(huì)被調(diào)用。本節(jié)后面將使用"不可訪問屬性(inaccessible properties)"和"不可訪問方法(inaccessible methods)"來稱呼這些未定義或不可見的類屬性或方法。

This is a misuse of the term overloading. This article should call this technique "interpreter hooks".

參加魔術(shù)方法php超全局變量,魔術(shù)常量,魔術(shù)方法

Note:
因?yàn)?PHP 處理賦值運(yùn)算的方式,__set() 的返回值將被忽略。類似的, 在下面這樣的鏈?zhǔn)劫x值中,__get() 不會(huì)被調(diào)用: $a = $obj->b = 8;

Note:
在除 isset() 外的其它語言結(jié)構(gòu)中無法使用重載的屬性,這意味著當(dāng)對(duì)一個(gè)重載的屬性使用 empty() 時(shí),重載魔術(shù)方法將不會(huì)被調(diào)用。
為避開此限制,必須將重載屬性賦值到本地變量再使用 empty()

遍歷對(duì)象

1.用 foreach 語句。默認(rèn)情況下,所有可見屬性都將被用于遍歷。

public[] = $i;
        }
    }
    function __destruct()
    {
        foreach ($this as $key => list($a, $b, $c)) {
            print "$key => [$a, $b, $c]
";
        }
    }
} as $key => list($a, $b, $c)) {
    print "$key => [$a, $b, $c]
";
}
echo "
";

//Result:
/*
public => [0, 1, 2]
public => [0, 1, 2]
protected => [3, 4, 5]
private => [6, 7, 8]
 */

2.實(shí)現(xiàn) Iterator 接口。可以讓對(duì)象自行決定如何遍歷以及每次遍歷時(shí)那些值可用。

var = $array;
        }
    }

    public function rewind() {
        echo "rewinding
";
        reset($this->var);
    }

    public function current() {
        $var = current($this->var);
        echo "current: $var
";
        return $var;
    }

    public function key() {
        $var = key($this->var);
        echo "key: $var
";
        return $var;
    }

    public function next() {
        $var = next($this->var);
        echo "next: $var
";
        return $var;
    }

    public function valid() {
        $var = $this->current() !== false;
        echo "valid: {$var}
";
        return $var;
    }
}

$values = array(1,2,3);
$it = new MyIterator($values);

foreach ($it as $a => $b) {
    print "$a: $b
";
}
?>

可以用 IteratorAggregate 接口以替代實(shí)現(xiàn)所有的 Iterator 方法。IteratorAggregate 只需要實(shí)現(xiàn)一個(gè)方法 IteratorAggregate::getIterator()其應(yīng)返回一個(gè)實(shí)現(xiàn)了 Iterator 的類的實(shí)例

Example #3 通過實(shí)現(xiàn) IteratorAggregate 來遍歷對(duì)象

items);
    }

    public function add($value) {
        $this->items[$this->count++] = $value;
    }
}

$coll = new MyCollection();
$coll->add("value 1");
$coll->add("value 2");
$coll->add("value 3");

foreach ($coll as $key => $val) {
    echo "key/value: [$key -> $val]

";
}
?>
PHP 5.5 及以后版本的用戶也可參考生成器,其提供了另一方法來定義 Iterators。
魔術(shù)方法

參見php超全局變量,魔術(shù)常量,魔術(shù)方法。

final

如果父類中的方法被聲明為 final,則子類無法覆蓋該方法。如果一個(gè)類被聲明為 final,則不能被繼承

屬性不能被定義為 final,只有類和方法才能被定義為 final。可以使用 const 定義為常量來代替。
對(duì)象復(fù)制(clone)

對(duì)象復(fù)制可以通過 clone 關(guān)鍵字來完成(如果可能,這將調(diào)用對(duì)象的 __clone() 方法)。對(duì)象中的 __clone() 方法不能被直接調(diào)用。

當(dāng)對(duì)象被復(fù)制后,PHP 5 會(huì)對(duì)對(duì)象的所有屬性執(zhí)行一個(gè)淺復(fù)制shallow copy)。所有的引用屬性 仍然會(huì)是一個(gè)指向原來的變量的引用
對(duì)象比較

==:如果兩個(gè)對(duì)象的屬性和屬性值都相等,而且兩個(gè)對(duì)象是同一個(gè)類的實(shí)例,那么這兩個(gè)對(duì)象變量相等。
===:這兩個(gè)對(duì)象變量一定要指向某個(gè)類的同一個(gè)實(shí)例(即同一個(gè)對(duì)象,但不需要引用賦值)。

flag = $flag; }
}

class OtherFlag
{
    public $flag;
    function __construct($flag = true) { $this->flag = $flag; }
}

$o = new Flag;
$p = new Flag;
$q = $o;
$r = new OtherFlag;
$s = new Flag(false);

echo "Two instances of the same class
";
compareObjects($o, $p);

echo "
Two references to the same instance
";
compareObjects($o, $q);

echo "
Instances of two different classes
";
compareObjects($o, $r);

echo "Two instances of the same class
";
compareObjects($o, $s);

//Result:
/*
Two instances of the same class
o1 == o2 : true
o1 === o2 : false

Two references to the same instance
o1 == o2 : true
o1 === o2 : true

Instances of two different classes
o1 == o2 : false
o1 === o2 : false

Two instances of the same class
o1 == o2 : false
o1 === o2 : false
 */
?>
后期靜態(tài)綁定

后期靜態(tài)綁定static:: 不再被解析為定義當(dāng)前方法所在的類,而是在實(shí)際運(yùn)行時(shí)計(jì)算的。也可以稱之為“靜態(tài)綁定”,因?yàn)樗梢杂糜冢ǖ幌抻冢╈o態(tài)方法的調(diào)用。

Example #2 static:: 簡(jiǎn)單用法


Finally we can implement some ActiveRecord methods:

 

Output: "Product"
對(duì)象和引用
Notes on reference:
A reference is not a pointer. However, an object handle IS a pointer. Example:

命名空間
定義命名空間

雖然任意合法的PHP代碼都可以包含在命名空間中,但只有以下類型的代碼受命名空間的影響,它們是:(包括抽象類traits)、接口函數(shù)常量

命名空間通過關(guān)鍵字 namespace 來聲明。如果一個(gè)文件中包含命名空間,它必須在其它所有代碼之前聲明命名空間,除了一個(gè)以外:declare關(guān)鍵字

define() will define constants exactly as specified:

Regarding constants defined with define() inside namespaces...

define() will define constants exactly as specified.  So, if you want to define a constant in a namespace, you will need to specify the namespace in your call to define(), even if you"re calling define() from within a namespace.  The following examples will make it clear.

The following code will define the constant "MESSAGE" in the global namespace (i.e. "MESSAGE").



The following code will define two constants in the "test" namespace.


在同一個(gè)文件中定義多個(gè)命名空間(不建議)

也可以在同一個(gè)文件中定義多個(gè)命名空間。在同一個(gè)文件中定義多個(gè)命名空間有兩種語法形式:簡(jiǎn)單組合語法大括號(hào)語法

Example #4 定義多個(gè)命名空間和不包含在命名空間中的代碼


使用命名空間:基礎(chǔ)

(PHP 5 >= 5.3.0, PHP 7)
在討論如何使用命名空間之前,必須了解 PHP 是如何知道要使用哪一個(gè)命名空間中的元素的。可以將 PHP 命名空間與文件系統(tǒng)作一個(gè)簡(jiǎn)單的類比。在文件系統(tǒng)中訪問一個(gè)文件有三種方式:

相對(duì)文件名形式foo.txt。它會(huì)被解析為 currentdirectory/foo.txt,其中 currentdirectory 表示當(dāng)前目錄。因此如果當(dāng)前目錄是 /home/foo,則該文件名被解析為/home/foo/foo.txt

相對(duì)路徑名形式subdirectory/foo.txt。它會(huì)被解析為 currentdirectory/subdirectory/foo.txt

絕對(duì)路徑名形式/main/foo.txt。它會(huì)被解析為/main/foo.txt

PHP 命名空間中的元素使用同樣的原理。例如,類名可以通過三種方式引用:

非限定名稱,或不包含前綴的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當(dāng)前命名空間是 currentnamespacefoo 將被解析為 currentnamespacefoo。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,則 foo 會(huì)被解析為foo。 警告:如果命名空間中的函數(shù)或常量未定義,則該非限定的函數(shù)名稱或常量名稱會(huì)被解析為全局函數(shù)名稱或常量名稱。詳情參見 使用命名空間:后備全局函數(shù)名稱/常量名稱。

限定名稱,或包含前綴的名稱,例如 $a = new subnamespacefoo(); 或 subnamespacefoo::staticmethod();。如果當(dāng)前的命名空間是 currentnamespace,則 foo 會(huì)被解析為 currentnamespacesubnamespacefoo。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,foo 會(huì)被解析為subnamespacefoo

完全限定名稱,或包含了全局前綴操作符的名稱,例如, $a = new currentnamespacefoo(); 或 currentnamespacefoo::staticmethod();。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespacefoo

下面是一個(gè)使用這三種方式的實(shí)例:

file1.php


file2.php


注意訪問任意全局類、函數(shù)或常量,都可以使用完全限定名稱,例如 strlen()ExceptionINI_ALL

Example #1 在命名空間內(nèi)部訪問全局類、函數(shù)和常量


命名空間和動(dòng)態(tài)語言特征

php.php


test.php


namespace關(guān)鍵字和__NAMESPACE__常量

常量__NAMESPACE__的值是包含當(dāng)前命名空間名稱的字符串。在全局的,不包括在任何命名空間中的代碼,它包含一個(gè)空的字符串。
關(guān)鍵字 namespace 可用來顯式訪問當(dāng)前命名空間或子命名空間中的元素。它等價(jià)于類中的 self 操作符。


使用命名空間:別名/導(dǎo)入

別名是通過操作符 use 來實(shí)現(xiàn)的:所有支持命名空間的PHP版本支持三種別名或?qū)敕绞剑?strong>為類名稱使用別名、為接口使用別名為命名空間名稱使用別名

PHP 5.6開始允許導(dǎo)入函數(shù)常量或者為它們?cè)O(shè)置別名。

Example #1 使用use操作符導(dǎo)入/使用別名


對(duì)命名空間中的名稱(包含命名空間分隔符的完全限定名稱如 FooBar以及相對(duì)的不包含命名空間分隔符的全局名稱如 FooBar)來說,前導(dǎo)的反斜杠是不必要的也不推薦的,因?yàn)閷?dǎo)入的名稱必須是完全限定的,不會(huì)根據(jù)當(dāng)前的命名空間作相對(duì)解析。

導(dǎo)入操作只影響非限定名稱和限定名稱。完全限定名稱由于是確定的,故不受導(dǎo)入的影響。

全局空間

如果沒有定義任何命名空間,所有的類與函數(shù)的定義都是在全局空間,與 PHP 引入命名空間概念前一樣。在名稱前加上前綴 表示該名稱是全局空間中的名稱,即使該名稱位于其它的命名空間中時(shí)也是如此。

使用命名空間:后備全局函數(shù)/常量

在一個(gè)命名空間中,當(dāng) PHP 遇到一個(gè)非限定的類、函數(shù)或常量名稱時(shí),它使用不同的優(yōu)先策略來解析該名稱。類名稱總是解析到當(dāng)前命名空間中的名稱。因此在訪問系統(tǒng)內(nèi)部或不包含在命名空間中的類名稱時(shí),必須使用完全限定名稱,例如:

getMessage();
} finally {
    echo PHP_EOL, "finally do";
}

//Result
/*
My Exception
finally do
 */
名稱解析規(guī)則

在說明名稱解析規(guī)則之前,我們先看一些重要的定義:

命名空間名稱定義

非限定名稱Unqualified name

名稱中不包含命名空間分隔符的標(biāo)識(shí)符,例如 Foo

限定名稱Qualified name

名稱中含有命名空間分隔符的標(biāo)識(shí)符,例如 FooBar

完全限定名稱Fully qualified name

名稱中包含命名空間分隔符,并以命名空間分隔符開始的標(biāo)識(shí)符,例如 FooBarnamespaceFoo 也是一個(gè)完全限定名稱。

名稱解析遵循下列規(guī)則:

對(duì)完全限定名稱的函數(shù),類和常量的調(diào)用在編譯時(shí)解析。例如 new AB 解析為類 AB

所有的非限定名稱和限定名稱(非完全限定名稱)根據(jù)當(dāng)前的導(dǎo)入規(guī)則在編譯時(shí)進(jìn)行轉(zhuǎn)換。例如,如果命名空間 ABC 被導(dǎo)入為 C,那么對(duì) CDe() 的調(diào)用就會(huì)被轉(zhuǎn)換為 ABCDe()

在命名空間內(nèi)部,所有的沒有根據(jù)導(dǎo)入規(guī)則轉(zhuǎn)換的限定名稱均會(huì)在其前面加上當(dāng)前的命名空間名稱。例如,在命名空間 AB 內(nèi)部調(diào)用 CDe(),則 CDe() 會(huì)被轉(zhuǎn)換為 ABCDe()

非限定類名根據(jù)當(dāng)前的導(dǎo)入規(guī)則在編譯時(shí)轉(zhuǎn)換(用全名代替短的導(dǎo)入名稱)。例如,如果命名空間 ABC 導(dǎo)入為C,則 new C() 被轉(zhuǎn)換為 new ABC()

在命名空間內(nèi)部(例如AB),對(duì)非限定名稱的函數(shù)調(diào)用是在運(yùn)行時(shí)解析的。例如對(duì)函數(shù) foo()
的調(diào)用是這樣解析的:

在當(dāng)前命名空間中查找名為 ABfoo() 的函數(shù)

嘗試查找并調(diào)用 全局(global) 空間中的函數(shù) foo()

在命名空間(例如AB)內(nèi)部對(duì)非限定名稱或限定名稱類(非完全限定名稱)的調(diào)用是在運(yùn)行時(shí)解析的。下面是調(diào)用 new C()new DE() 的解析過程: new C()的解析:

在當(dāng)前命名空間中查找ABC類。

嘗試自動(dòng)裝載類ABC

new DE()的解析:

在類名稱前面加上當(dāng)前命名空間名稱變成:ABDE,然后查找該類。

嘗試自動(dòng)裝載類 ABDE

為了引用全局命名空間中的全局類,必須使用完全限定名稱 new C()

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/28191.html

相關(guān)文章

  • php易錯(cuò)筆記-類型

    摘要:非法下標(biāo)類型會(huì)產(chǎn)生一個(gè)級(jí)別錯(cuò)誤。用負(fù)數(shù)下標(biāo)寫入字符串時(shí)會(huì)產(chǎn)生一個(gè)級(jí)別錯(cuò)誤,用負(fù)數(shù)下標(biāo)讀取字符串時(shí)返回空字符串。浮點(diǎn)數(shù)也會(huì)被轉(zhuǎn)換為整型,意味著其小數(shù)部分會(huì)被舍去。 Boolean 當(dāng)轉(zhuǎn)換為 boolean 時(shí),以下值被認(rèn)為是 FALSE:布爾值 FALSE 本身整型值 0(零)浮點(diǎn)型值 0.0(零)空字符串,以及字符串 0不包括任何元素的數(shù)組[]特殊類型 NULL(包括尚未賦值的變量)從...

    tinyq 評(píng)論0 收藏0
  • php.類與對(duì)象

    摘要:接口可以使用常量,叫接口常量,和類的常量使用方法相同類可以同時(shí)繼承多個(gè)接口使用接口常量抽象類不能被實(shí)例化。繼承抽象類,子類必須實(shí)現(xiàn)父類中所有的抽象方法。 訪問控制 屬性和方法的訪問控制(可見標(biāo)識(shí)):public 任何地方private 類自身protected 類自身,自子類及自父類 this this 可以理解為這個(gè)類的一個(gè)實(shí)例 self self 代表類本身 __construc...

    scq000 評(píng)論0 收藏0
  • php易錯(cuò)筆記-流程控制,函數(shù)

    摘要:的語法和其它流程控制結(jié)構(gòu)相似部分允許設(shè)定代碼段的行為。返回值在失敗時(shí)返回并且發(fā)出警告。當(dāng)一個(gè)函數(shù)是有條件被定義時(shí),必須在調(diào)用函數(shù)之前定義。有條件的函數(shù)不能在此處調(diào)用函數(shù),因?yàn)樗€不存在,但可以調(diào)用函數(shù)。 流程控制 PHP 提供了一些流程控制的替代語法,包括 if,while,for,foreach 和 switch。替代語法的基本形式是把左花括號(hào)({)換成冒號(hào)(:),把右花括號(hào)(})分...

    mrcode 評(píng)論0 收藏0
  • PHP 手冊(cè)閱讀筆記 - 語言參考篇

    摘要:最近計(jì)劃把手冊(cè),認(rèn)真的先過一遍。語言參考類型新認(rèn)知強(qiáng)制轉(zhuǎn)換類型用。后期靜態(tài)綁定從這里開始語言參考生成器新認(rèn)知生成器汗水的核心是關(guān)鍵字。語言參考預(yù)定義變量超全局變量前一個(gè)錯(cuò)誤信息原始數(shù)據(jù)以上 showImg(https://segmentfault.com/img/remote/1460000010147451); 最近計(jì)劃把 PHP手冊(cè),認(rèn)真的先過一遍。記錄一些以前不知道,不明確的知識(shí)...

    Developer 評(píng)論0 收藏0
  • PHP面試常考內(nèi)容之面向對(duì)象(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 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

MartinHan

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<