摘要:如果有此需要,同樣要使用匿名函數。以上兩點可以總結為函數對應于常量,匿名函數對應于變量。匿名函數生成類的實例類聲明通過表明繼承關系,不支持多重繼承。覆蓋方法時,參數必須保持一致,否則會拋出警告。
函數
函數具有全局作用域,可以定義在一個函數之內而在該函數之外調用。
function foo() { function bar() { echo "I don"t exist until foo() is called. "; } } /* 現在還不能調用bar()函數,因為它還不存在 */ foo(); /* 現在可以調用bar()函數了,因為foo()函數 的執行使得bar()函數變為已定義的函數 */ bar();
如果要保證定義在函數內部的函數外部不可用,需要使用匿名函數:
function foo() { $bar = function() { echo "inside"; }; }
函數無法重載,無法取消和重定義。如果有此需要,同樣要使用匿名函數。
以上兩點可以總結為:函數對應于常量,匿名函數對應于變量。
遞歸函數調用過百可能會使堆棧崩潰。
函數的默認參數只能用常量表達式定義,不能是變量、函數調用!
函數不能返回多個值。
從函數返回引用時,必須在函數聲明和指派返回值時都使用引用運算符:
function &returns_reference() { return $someref; } $newref =& returns_reference();
匿名函數訪問閉包內的變量需要用use ($var)聲明,只讀訪問。
PHP也支持類似Perl和sh的函數定義,在定義時不指定參數,通過func_num_args()、func_get_arg()和func_get_args()處理應用函數時傳入的參數。
函數的參數可以指定類型,例如對象(指定類的名字)、接口、數組、或者callable,但是不能是數字或字符串,Traits也不允許。(據說SVN里有支持數字、字符串的一個實現,但是最后PHP是否會支持這一特性仍然未定。)
匿名函數生成Closure類的實例:
boris> $lambda = function() { echo "hi"; }; → object(Closure)( )類
class聲明通過extends表明繼承關系,不支持多重繼承。
可以通過parent::訪問被覆蓋的方法或屬性。
父類定義方法時聲明final,則不可覆蓋。(final還可用于聲明類,final類不能被繼承。)
覆蓋方法時,參數必須保持一致,否則會拋出E_STRICT警告。
使用ClassName::class可以獲取類的完全名稱,對使用了命名空間的類尤其有用。
類的屬性只能初始化為定值!
{ // 錯誤的屬性聲明 public $var1 = "hello " . "world"; public $var2 = <<類中可以定義__construct(),用于建立對象時的初始化工作。顯式地銷毀某個對象,或者對某個對象的所有引用都沒刪除時,會執行__destruct()。
屬性必須被定義為public、protected(子類、父類可見)、private之一。
類中的方法同理,但是默認public。
聲明屬性或方法為static,就可以不實例化而直接訪問,例如通過::。靜態屬性不能通過對象來訪問(但靜態方法可以)。
abstract類不能被實例化。一旦有一個方法被聲明為abstract,類就必須被聲明為abstract。繼承抽象類的時候,子類必須定義父類中的所有抽象方法,并且這些方法的訪問控制不能比父類嚴格。
abstract class AbstractClass { // 強制要求子類定義這些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法) public function printOut() { print $this->getValue() . " "; } }和抽象類相似的概念是接口,接口的特性是接口中定義的所有方法都必須是公有的。
interface a { public function foo(); } interface b extends a { public function baz(Baz $baz); } class c implements b { public function foo() { } public function baz(Baz $baz) { } }實現接口的類必須實現接口中定義的所有方法。
類可以實現多個接口,用逗號來分隔多個接口的名稱。(實現多個接口時,接口中的方法不能有重名。)
接口中定義的常量不能被子類或子接口所覆蓋。
使用trait可以水平組合功能:
trait Hello { public function sayHello() { echo "Hello "; } } trait World { public function sayWorld() { echo "World"; } } class MyHelloWorld { use Hello, World; public function sayExclamationMark() { echo "!"; } }trait不能實例化,優先級比類當前成員低,但比繼承的成員高。
多個trait沖突時,使用insteadof指明使用哪一個方法,as將方法以其他名稱引入。
class Aliased_Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; B::bigTalk as talk; } }as還可用于修改訪問控制:
class MyClass1 { use HelloWorld { sayHello as protected; } } class MyClass2 { use HelloWorld { sayHello as private myPrivateHello; } }trait可以互相引用:
trait HelloWorld { use Hello, World; }trait同樣支持抽象方法:
trait Hello { public function sayHelloWorld() { echo "Hello".$this->getWorld(); } abstract public function getWorld(); }trait不能定義static 變量,trait定義的靜態方法,使用trait的類可以用。
trait定義了屬性之后,類不能定義同樣名稱的屬性。
PHP的重載和別的語言不一樣,它指動態地創建屬性和方法。
屬性:
在給不可訪問屬性賦值時,__set()會被調用。
讀取不可訪問屬性的值時,__get()會被調用。
當對不可訪問屬性調用 isset() 或 empty() 時,__isset()會被調用。
當對不可訪問屬性調用 unset() 時,__unset() 會被調用。
方法:
在對象中調用一個不可訪問方法時,__call() 會被調用。
用靜態方式中調用一個不可訪問方法時,__callStatic() 會被調用。
foreach可以遍歷對象的所有可見屬性。可以通過實現Iterator或IteratorAggregate接口來指明如何遍歷。
Traversable是一個抽象接口,可以用來檢查是否可以被foreach遍歷:
if( !is_array( $items ) && !$items instanceof Traversable ) //Throw exception here使用clone關鍵字可以復制一個對象,對象的所有屬性是淺復制。如果定義了__clone()方法,那么復制完成會調用該方法,可用于修改屬性的值。
==屬性、屬性值、類均同。===同一對象。
PHP 5.3.0 起支持了 late static bindings,綁定的方法會調用運行時(late)首先調用該方法的類,復用了static關鍵字。
class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // Here comes Late Static Bindings } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); // B對象變量保存一個標識符來訪問真正的對象內容,當對象作為參數傳遞,作為結果返回,或者賦值給另外一個變量,另外一個變量跟原來的不是引用的關系,只是他們都保存著同一個標識符的拷貝,這個標識符指向同一個對象的真正內容。
所有php里面的值都可以使用函數serialize()來返回一個字符串表示。 unserialize()函數能夠重新把字符串變回php原來的值。序列化一個對象將會保存對象的所有變量,但是不會保存對象的方法,只會保存類的名字。
魔術方法以__開頭,除了上面提到的以外,還有:
__sleep()和__wakeup(),分別對應于serialize()和unserialize(),一個常用于提交未提交的數據,一個常用于執行初始化操作。
__toString() 方法用于一個類被當成字符串時應怎樣回應。
__invoke() 當嘗試以調用函數的方式調用一個對象時調用此方法。
__set_state(),用于 var_export() 導出類時。
如果類實現了Serializable接口,那么這個類就不再支持__sleep()和__wakeup()。
命名空間類、函數、常量受命名空間的影響。
通過namespace聲明,必須在所有代碼(除declare編碼語句)之前(包括非PHP代碼)。
同一個命名空間的內容可以分割存放在不同文件中。
命名空間可以分層定義:
namespace MyProjectSubLevel;可以在同一文件中定義多個命名空間,但是不推薦。如果實在要這么做,建議用大括號括起不同的命名空間。將全局的非命名空間代碼和命名空間的代碼組合時,必須加大括號。全局代碼用不帶名稱的namespace語句聲明。
常量__NAMESPACE__的值是包含當前命名空間名稱的字符串。關鍵字namespace可用來顯式訪問當前命名空間或子命名空間中的元素。它等價于類中的 self 操作符。
命名空間名稱或類名稱可以使用別名:
namespace foo; use MyFullClassname as Another;命名空間內部,用 表示該名稱是全局空間中的名稱。
異常處理使用throw、catch、try語句。
function inverse($x) { if (!$x) { throw new Exception("Division by zero."); } else return 1/$x; } try { echo inverse(5) . " "; echo inverse(0) . " "; } catch (Exception $e) { echo "Caught exception: ", $e->getMessage(), " "; } // Continue execution echo "Hello World";Exception 類
Exception { /* 屬性 */ protected string $message ; protected int $code ; protected string $file ; protected int $line ; /* 方法 */ public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] ) final public string getMessage ( void ) final public Exception getPrevious ( void ) final public int getCode ( void ) final public string getFile ( void ) final public int getLine ( void ) final public array getTrace ( void ) final public string getTraceAsString ( void ) public string __toString ( void ) final private void __clone ( void )生成器通常只需用yield取代return。
例如,用生成器重新實現低內存占用的range()函數:
function xrange($start, $limit, $step = 1) { if ($start < $limit) { if ($step <= 0) { throw new LogicException("Step must be +ve"); } for ($i = $start; $i <= $limit; $i += $step) { yield $i; } } else { if ($step >= 0) { throw new LogicException("Step must be -ve"); } for ($i = $start; $i >= $limit; $i += $step) { yield $i; } } }yield可以返回鍵值對:
function input_parser($input) { foreach (explode(" ", $input) as $line) { $fields = explode(";", $line); $id = array_shift($fields); yield $id => $fields; } }生成器函數第一次調用時,會返回一個內部的Generator類(無法使用new實例化的類)的對象。類似于Iterator接口,但是多了一個send()方法。
Generator::send()允許迭代的時候插入值。插入的值會被yield語句返回,并且可以在生成器函數中使用。
相比實現一個Iterator類,生成器要簡單地多,往往能提升代碼可讀性。
超全局變量在一個腳本的全部作用域中都可用。
$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_SESSION
$_REQUEST
$_ENV
其他預定義變量$php_errormsg (僅在 php.ini 文件中的 track_errors 配置項開啟的情況下可用。默認關閉。)
$argc
$argv
ArrayAccess接口實現了這一接口的類可以當數組用。
ArrayAccess { /* Methods */ abstract public boolean offsetExists ( mixed $offset ) abstract public mixed offsetGet ( mixed $offset ) abstract public void offsetSet ( mixed $offset , mixed $value ) abstract public void offsetUnset ( mixed $offset ) }
Day 0 - 5 列表
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/20637.html
這個系列就暫時告一段落了。這是一個目錄。 Day 0 起步 Day 1 基本語法 Day 2 REPL 和 包管理 Day 3 語言參考 Day 4 語言參考(下半篇) Day 5 練手程序
摘要:掃下手冊的語言參考。允許的強制轉換有。錯誤控制置于表達式前時,忽略該表達式產生的錯誤信息。運行外部程序使用反引號,效果等同于函數。文件未找到時,給出錯誤,而僅僅給出警告。目標位置用目標名稱加上冒號標記,必須位于同一文件和作用域。 掃下手冊的語言參考。(函數以前) 類型 有boolean、integer、float、string、array等類型。 可以通過gettype函數查看類...
摘要:包管理試用了,新一代的包管理器,感覺不錯。習題答案習題見圖書優惠活動,計算需要付的金額。文件讀寫函數有,表示追加,鎖定文件,避免別的進程同時讀寫。 最新版 Debian Wheezy下的PHP是5.4的,day0時說圖方便就裝了5.4。但是看文檔是5.5的,所以琢磨著還是用最新版算了。 Debian Wheezy有dotdeb.org提供php-5.5。安裝很方便。 將下列內容加...
摘要:記錄一下學習的軌跡。起步推薦用最新的。內建服務器這年頭大部分語言都支持這一出了。交互式的環境學習方便,推薦下家的是用寫的。結尾可以省略,然后可以簡寫成,于是上面的可以簡寫成當然像這種一行的,用也成練習題感謝出題搭好環境,寫出第一個。 記錄一下學習的軌跡。 入門資料 對我而言好的入門資料要符合兩個要求: 能夠切實幫助以比較正的方式入門 薄 真沒找到什么好的入門資料。沒有《Di...
摘要:云計算從概念萌芽期如今正在成為基礎設施的水和電。他們共同對云計算的下一步發展特點以及企業關注重點等問題進行了討論。所以,在國內說云計算發展的下一個階段似乎比下半場更加合適,那么下一個階段將有哪些新的特點呢各位嘉賓也提出了自己的看法。 云計算可以說是近幾年企業服務發展最快的領域之一,同時也是產業互聯網發展的基礎。云計算從概念萌芽期如今正在成為 IT 基礎設施的水和電。12 月 21 日,幾位云...
閱讀 1245·2023-04-25 18:57
閱讀 2127·2023-04-25 16:28
閱讀 3926·2021-11-24 09:39
閱讀 3631·2021-11-16 11:45
閱讀 1817·2021-10-13 09:40
閱讀 1260·2019-08-30 15:52
閱讀 1716·2019-08-30 10:57
閱讀 657·2019-08-29 16:55