php.netphp
<?php $str = <<<EOD Example of string spanning multiple lines using heredoc syntax. EOD; //在EOD後必需要包含一個換行
<?php $str = <<<'EOD' Example of string spanning multiple lines using nowdoc syntax. EOD;
關於字符串的編碼
PHP 中的 string 的實現方式是一個由字節組成的數組再加上一個整數指明緩衝區長度。如何將字節轉換成字符的信息,由程序員來決定。字符串由什麼值來組成並沒有限制;特別的,其值爲 0(「NUL bytes」)的字節能夠處於字符串任何位置(不過有幾個函數,在本手冊中被稱爲非「二進制安全」的,也許會把 NUL 字節以後的數據全都忽略)。
若是一個腳本的編碼是 ISO-8859-1,則其中的字符串也會被編碼爲 ISO-8859-1,以此類推。不過這並不適用於激活了 Zend Multibyte 時。程序員
將一個對象轉換成對象,它將不會有任何變化。若是其它任何類型的值被轉換成對象,將會建立一個內置類 stdClass 的實例。若是該值爲 NULL,則新的實例爲空。數組轉換成對象將使鍵名成爲屬性名並具備相對應的值。對於任何其它的值,名爲 scalar 的成員變量將包含該值shell
自 PHP 5.4 起可用 callable 類型指定回調類型 callback。數組
在 PHP 的函數和類的方法中,超全局變量不能用做可變變量。$this 變量也是一個特殊變量,不能被動態引用。安全
__LINE__ 文件中的當前行號。 __FILE__ 文件的完整路徑和文件名。(若是是符號鏈接,則是解析後的絕對路徑) __DIR__ 文件所在的目錄。它等價於 dirname(__FILE__) __FUNCTION__ 返回該函數被定義時的名字(區分大小寫) __CLASS__ 返回該類被定義時的名字(區分大小寫) __METHOD__ 類的方法名。返回該方法被定義時的名字(區分大小寫) __NAMESPACE__ 當前命名空間的名稱(區分大小寫)
$a ** $b
a的b次方(php5.6+)在模板中使用真是棒棒的。
PHP 提供了一些流程控制的替代語法,包括 if,while,for,foreach 和 switch。替代語法的基本形式是把左花括號({)換成冒號(:),把右花括號(})分別換成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。php7
<?php if ($a == 5): ?> A is equal to 5 <?php endif; ?>
任何有效的 PHP 代碼都有可能出如今函數內部,甚至包括其它函數和類定義。
函數無需在調用以前被定義,除非是下面兩個例子中函數是有條件被定義時。
當一個函數是有條件被定義時,必須在調用函數以前定義。閉包
<?php $makefoo = true; /* 不能在此處調用foo()函數, 由於它還不存在,但能夠調用bar()函數。*/ bar(); if ($makefoo) { function foo() { echo "I don't exist until program execution reaches me.\n"; } } /* 如今能夠安全調用函數 foo()了, 由於 $makefoo 值爲真 */ if ($makefoo) foo(); function bar() { echo "I exist immediately upon program start.\n"; } ?>
PHP 中的全部函數和類都具備全局做用域,能夠定義在一個函數以內而在以外調用,反之亦然。app
<?php function foo() { function bar() { echo "I don't exist until foo() is called.\n"; } } foo(); /* 如今能夠調用bar()函數了,由於foo()函數 的執行使得bar()函數變爲已定義的函數 */ bar(); ?>
若是想要函數的一個參數老是經過引用傳遞,能夠在函數定義中該參數的前面加上符號 &。傳引用的參數也能夠有默認值。函數
the given value is of the incorrect type, then an error is generated: in PHP 5, this will be a recoverable fatal error, while PHP 7 will throw a TypeError exception.ui
Class/interface name The parameter must be an instanceof the given class or interface name. PHP 5.0.0 array The parameter must be an array. PHP 5.1.0 callable The parameter must be a valid callable. PHP 5.4.0 bool The parameter must be a boolean value. PHP 7.0.0 float The parameter must be a floating point number. PHP 7.0.0 int The parameter must be an integer. PHP 7.0.0 string The parameter must be a string. PHP 7.0.0
默認狀況下若是能夠轉換,php會將不符合聲明的傳入參數轉換,可使用strict_type。
note
declare(strict_types=1){XXXXX}
結構設置declare做用域,只能是declare(strict_types=1) ;
Strict typing applies to function calls made from within the file with strict typing enabled, not to the functions declared within that file.
function sum($a, $b): float { return $a + $b; }
在 PHP 5.6 及以上的版本中,由 ... 語法實現;在 PHP 5.5 及更早版本中(php7也可以使用),使用函數 func_num_args(),func_get_arg(),和 func_get_args() 。
//...前邊能夠帶有普通參數,也能夠有類型提示(必須所有知足) function sum(...$numbers) { $acc = 0; foreach ($numbers as $n) { $acc += $n; } return $acc; }
You can also use ... when calling functions to unpack an array or Traversable variable or literal into the argument list:
function add($a, $b) { return $a + $b; } $a = [1, 2]; echo add(...$a);
可變函數不能用於例如 echo,print,unset(),isset(),empty(),include,require 以及相似的語言結構。須要使用本身的包裝函數來將這些結構用做可變。
$foo->$funcname(); Foo::$variable();
匿名函數(Anonymous functions),也叫閉包函數(closures)。
$greet = function($name) { printf("Hello %s\r\n", $name); }; $greet('World'); $greet('PHP');
閉包能夠從父做用域中繼承變量。 任何此類變量都應該用 use 語言結構傳遞進去。閉包的父做用域是定義該閉包的函數(不必定是調用它的函數)
$message = 'hello'; // 繼承 $message,不用use會報錯 $example = function () use ($message) { var_dump($message); }; echo $example();