源代碼下載:?learnphp-zh.php
這份教程所使用的版本是 PHP 5+.
<?php // PHP必須被包圍于 <?php ? > 之中
// 如果你的文件中只有php代碼,那么最好省略結(jié)束括號(hào)標(biāo)記
// 這是單行注釋的標(biāo)志
# 井號(hào)也可以,但是//更常見(jiàn)
/*
這是多行注釋
*/
// 使用 "echo" 或者 "print" 來(lái)輸出信息到標(biāo)準(zhǔn)輸出
print('Hello '); // 輸出 "Hello " 并且沒(méi)有換行符
// () 對(duì)于echo和print是可選的
echo "World\n"; // 輸出 "World" 并且換行
// (每個(gè)語(yǔ)句必須以分號(hào)結(jié)尾)
// 在 <?php 標(biāo)簽之外的語(yǔ)句都被自動(dòng)輸出到標(biāo)準(zhǔn)輸出
?>Hello World Again!
<?php
/************************************
* 類型與變量
*/
// 變量以$開(kāi)始
// 變量可以以字母或者下劃線開(kāi)頭,后面可以跟著數(shù)字、字母和下劃線
// 布爾值是大小寫(xiě)無(wú)關(guān)的
$boolean = true; // 或 TRUE 或 True
$boolean = false; // 或 FALSE 或 False
// 整型
$int1 = 12; // => 12
$int2 = -12; // => -12
$int3 = 012; // => 10 (0開(kāi)頭代表八進(jìn)制數(shù))
$int4 = 0x0F; // => 15 (0x開(kāi)頭代表十六進(jìn)制數(shù))
// 浮點(diǎn)型 (即雙精度浮點(diǎn)型)
$float = 1.234;
$float = 1.2e3;
$float = 7E-10;
// 算數(shù)運(yùn)算
$sum = 1 + 1; // 2
$difference = 2 - 1; // 1
$product = 2 * 2; // 4
$quotient = 2 / 1; // 2
// 算數(shù)運(yùn)算的簡(jiǎn)寫(xiě)
$number = 0;
$number += 1; // $number 自增1
echo $number++; // 輸出1 (運(yùn)算后自增)
echo ++$number; // 輸出3 (自增后運(yùn)算)
$number /= $float; // 先除后賦值給 $number
// 字符串需要被包含在單引號(hào)之中
$sgl_quotes = '$String'; // => '$String'
// 如果需要在字符串中引用變量,就需要使用雙引號(hào)
$dbl_quotes = "This is a $sgl_quotes."; // => 'This is a $String.'
// 特殊字符只有在雙引號(hào)中有用
$escaped = "This contains a \t tab character.";
$unescaped = 'This just contains a slash and a t: \t';
// 可以把變量包含在一對(duì)大括號(hào)中
$money = "I have $${number} in the bank.";
// 自 PHP 5.3 開(kāi)始, nowdocs 可以被用作多行非計(jì)算型字符串
$nowdoc = <<<'END'
Multi line
string
END;
// 而Heredocs則可以用作多行計(jì)算型字符串
$heredoc = <<<END
Multi line
$sgl_quotes
END;
// 字符串需要用 . 來(lái)連接
echo 'This string ' . 'is concatenated';
/********************************
* 數(shù)組
*/
// PHP 中的數(shù)組都是關(guān)聯(lián)型數(shù)組,也就是某些語(yǔ)言中的哈希表或字典
// 在所有PHP版本中均適用:
$associative = array('One' => 1, 'Two' => 2, 'Three' => 3);
// PHP 5.4 中引入了新的語(yǔ)法
$associative = ['One' => 1, 'Two' => 2, 'Three' => 3];
echo $associative['One']; // 輸出 1
// 聲明為列表實(shí)際上是給每個(gè)值都分配了一個(gè)整數(shù)鍵(key)
$array = ['One', 'Two', 'Three'];
echo $array[0]; // => "One"
/********************************
* 輸出
*/
echo('Hello World!');
// 輸出到標(biāo)準(zhǔn)輸出
// 此時(shí)標(biāo)準(zhǔn)輸出就是瀏覽器中的網(wǎng)頁(yè)
print('Hello World!'); // 和echo相同
// echo和print實(shí)際上也屬于這個(gè)語(yǔ)言本身,所以我們省略括號(hào)
echo 'Hello World!';
print 'Hello World!';
$paragraph = 'paragraph';
echo 100; // 直接輸出標(biāo)量
echo $paragraph; // 或者輸出變量
// 如果你配置了短標(biāo)簽,或者使用5.4.0及以上的版本
// 你就可以使用簡(jiǎn)寫(xiě)的echo語(yǔ)法
?>
<p><?= $paragraph ?></p>
<?php
$x = 1;
$y = 2;
$x = $y; // $x 現(xiàn)在和 $y 的值相同
$z = &$y;
// $z 現(xiàn)在持有 $y 的引用. 現(xiàn)在更改 $z 的值也會(huì)更改 $y 的值,反之亦然
// 但是改變 $y 的值不會(huì)改變 $x 的值
echo $x; // => 2
echo $z; // => 2
$y = 0;
echo $x; // => 2
echo $z; // => 0
/********************************
* 邏輯
*/
$a = 0;
$b = '0';
$c = '1';
$d = '1';
// 如果assert的參數(shù)為假,就會(huì)拋出警告
// 下面的比較都為真,不管它們的類型是否匹配
assert($a == $b); // 相等
assert($c != $a); // 不等
assert($c <> $a); // 另一種不等的表示
assert($a < $c);
assert($c > $b);
assert($a <= $b);
assert($c >= $d);
// 下面的比較只有在類型相同、值相同的情況下才為真
assert($c === $d);
assert($a !== $d);
assert(1 === '1');
assert(1 !== '1');
// 變量可以根據(jù)其使用來(lái)進(jìn)行類型轉(zhuǎn)換
$integer = 1;
echo $integer + $integer; // => 2
$string = '1';
echo $string + $string; // => 2 (字符串在此時(shí)被轉(zhuǎn)化為整數(shù))
$string = 'one';
echo $string + $string; // => 0
// 輸出0,因?yàn)?one'這個(gè)字符串無(wú)法被轉(zhuǎn)換為整數(shù)
// 類型轉(zhuǎn)換可以將一個(gè)類型視作另一種類型
$boolean = (boolean) 1; // => true
$zero = 0;
$boolean = (boolean) $zero; // => false
// 還有一些專用的函數(shù)來(lái)進(jìn)行類型轉(zhuǎn)換
$integer = 5;
$string = strval($integer);
$var = null; // 空值
/********************************
* 控制結(jié)構(gòu)
*/
if (true) {
print 'I get printed';
}
if (false) {
print 'I don\'t';
} else {
print 'I get printed';
}
if (false) {
print 'Does not get printed';
} elseif(true) {
print 'Does';
}
// 三目運(yùn)算符
print (false ? 'Does not get printed' : 'Does');
$x = 0;
if ($x === '0') {
print 'Does not print';
} elseif($x == '1') {
print 'Does not print';
} else {
print 'Does print';
}
// 下面的語(yǔ)法常用于模板中:
?>
<?php if ($x): ?>
This is displayed if the test is truthy.
<?php else: ?>
This is displayed otherwise.
<?php endif; ?>
<?php
// 用switch來(lái)實(shí)現(xiàn)相同的邏輯
switch ($x) {
case '0':
print 'Switch does type coercion';
break; // 在case中必須使用一個(gè)break語(yǔ)句,
// 否則在執(zhí)行完這個(gè)語(yǔ)句后會(huì)直接執(zhí)行后面的語(yǔ)句
case 'two':
case 'three':
// 如果$variable是 'two' 或 'three',執(zhí)行這里的語(yǔ)句
break;
default:
// 其他情況
}
// While, do...while 和 for 循環(huán)
$i = 0;
while ($i < 5) {
echo $i++;
}; // 輸出 "01234"
echo "\n";
$i = 0;
do {
echo $i++;
} while ($i < 5); // 輸出 "01234"
echo "\n";
for ($x = 0; $x < 10; $x++) {
echo $x;
} // 輸出 "0123456789"
echo "\n";
$wheels = ['bicycle' => 2, 'car' => 4];
// Foreach 循環(huán)可以遍歷數(shù)組
foreach ($wheels as $wheel_count) {
echo $wheel_count;
} // 輸出 "24"
echo "\n";
// 也可以同時(shí)遍歷鍵和值
foreach ($wheels as $vehicle => $wheel_count) {
echo "A $vehicle has $wheel_count wheels";
}
echo "\n";
$i = 0;
while ($i < 5) {
if ($i === 3) {
break; // 退出循環(huán)
}
echo $i++;
} // 輸出 "012"
for ($i = 0; $i < 5; $i++) {
if ($i === 3) {
continue; // 跳過(guò)此次遍歷
}
echo $i;
} // 輸出 "0124"
/********************************
* 函數(shù)
*/
// 通過(guò)"function"定義函數(shù):
function my_function () {
return 'Hello';
}
echo my_function(); // => "Hello"
// 函數(shù)名需要以字母或者下劃線開(kāi)頭,
// 后面可以跟著任意的字母、下劃線、數(shù)字.
function add ($x, $y = 1) { // $y 是可選參數(shù),默認(rèn)值為 1
$result = $x + $y;
return $result;
}
echo add(4); // => 5
echo add(4, 2); // => 6
// $result 在函數(shù)外部不可訪問(wèn)
// print $result; // 拋出警告
// 從 PHP 5.3 起我們可以定義匿名函數(shù)
$inc = function ($x) {
return $x + 1;
};
echo $inc(2); // => 3
function foo ($x, $y, $z) {
echo "$x - $y - $z";
}
// 函數(shù)也可以返回一個(gè)函數(shù)
function bar ($x, $y) {
// 用 'use' 將外部的參數(shù)引入到里面
return function ($z) use ($x, $y) {
foo($x, $y, $z);
};
}
$bar = bar('A', 'B');
$bar('C'); // 輸出 "A - B - C"
// 你也可以通過(guò)字符串調(diào)用函數(shù)
$function_name = 'add';
echo $function_name(1, 2); // => 3
// 在通過(guò)程序來(lái)決定調(diào)用哪個(gè)函數(shù)時(shí)很有用
// 或者,使用 call_user_func(callable $callback [, $parameter [, ... ]]);
/********************************
* 導(dǎo)入
*/
<?php
// 被導(dǎo)入的php文件也必須以php開(kāi)標(biāo)簽開(kāi)始
include 'my-file.php';
// 現(xiàn)在my-file.php就在當(dāng)前作用域中可見(jiàn)了
// 如果這個(gè)文件無(wú)法被導(dǎo)入(比如文件不存在),會(huì)拋出警告
include_once 'my-file.php';
// my-file.php中的代碼在其他地方被導(dǎo)入了,那么就不會(huì)被再次導(dǎo)入
// 這會(huì)避免類的多重定義錯(cuò)誤
require 'my-file.php';
require_once 'my-file.php';
// 和include功能相同,只不過(guò)如果不能被導(dǎo)入時(shí),會(huì)拋出錯(cuò)誤
// my-include.php的內(nèi)容:
<?php
return 'Anything you like.';
// 文件結(jié)束
// Include和Require函數(shù)也有返回值
$value = include 'my-include.php';
// 被引入的文件是根據(jù)文件路徑或者include_path配置來(lái)查找到的
// 如果文件最終沒(méi)有被找到,那么就會(huì)查找當(dāng)前文件夾。之后才會(huì)報(bào)錯(cuò)
/* */
/********************************
* 類
*/
// 類是由class關(guān)鍵字定義的
class MyClass
{
const MY_CONST = 'value'; // 常量
static $staticVar = 'static';
// 屬性必須聲明其作用域
public $property = 'public';
public $instanceProp;
protected $prot = 'protected'; // 當(dāng)前類和子類可訪問(wèn)
private $priv = 'private'; // 僅當(dāng)前類可訪問(wèn)
// 通過(guò) __construct 來(lái)定義構(gòu)造函數(shù)
public function __construct($instanceProp) {
// 通過(guò) $this 訪問(wèn)當(dāng)前對(duì)象
$this->instanceProp = $instanceProp;
}
// 方法就是類中定義的函數(shù)
public function myMethod()
{
print 'MyClass';
}
final function youCannotOverrideMe()
{
}
public static function myStaticMethod()
{
print 'I am static';
}
}
echo MyClass::MY_CONST; // 輸出 'value';
echo MyClass::$staticVar; // 輸出 'static';
MyClass::myStaticMethod(); // 輸出 'I am static';
// 通過(guò)new來(lái)新建實(shí)例
$my_class = new MyClass('An instance property');
// 如果不傳遞參數(shù),那么括號(hào)可以省略
// 用 -> 來(lái)訪問(wèn)成員
echo $my_class->property; // => "public"
echo $my_class->instanceProp; // => "An instance property"
$my_class->myMethod(); // => "MyClass"
// 使用extends來(lái)生成子類
class MyOtherClass extends MyClass
{
function printProtectedProperty()
{
echo $this->prot;
}
// 方法覆蓋
function myMethod()
{
parent::myMethod();
print ' > MyOtherClass';
}
}
$my_other_class = new MyOtherClass('Instance prop');
$my_other_class->printProtectedProperty(); // => 輸出 "protected"
$my_other_class->myMethod(); // 輸出 "MyClass > MyOtherClass"
final class YouCannotExtendMe
{
}
// 你可以使用“魔法方法”來(lái)生成getter和setter方法
class MyMapClass
{
private $property;
public function __get($key)
{
return $this->$key;
}
public function __set($key, $value)
{
$this->$key = $value;
}
}
$x = new MyMapClass();
echo $x->property; // 會(huì)使用 __get() 方法
$x->property = 'Something'; // 會(huì)使用 __set() 方法
// 類可以是被定義成抽象類 (使用 abstract 關(guān)鍵字) 或者
// 去實(shí)現(xiàn)接口 (使用 implements 關(guān)鍵字).
// 接口需要通過(guò)interface關(guān)鍵字來(lái)定義
interface InterfaceOne
{
public function doSomething();
}
interface InterfaceTwo
{
public function doSomethingElse();
}
// 接口可以被擴(kuò)展
interface InterfaceThree extends InterfaceTwo
{
public function doAnotherContract();
}
abstract class MyAbstractClass implements InterfaceOne
{
public $x = 'doSomething';
}
class MyConcreteClass extends MyAbstractClass implements InterfaceTwo
{
public function doSomething()
{
echo $x;
}
public function doSomethingElse()
{
echo 'doSomethingElse';
}
}
// 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口
class SomeOtherClass implements InterfaceOne, InterfaceTwo
{
public function doSomething()
{
echo 'doSomething';
}
public function doSomethingElse()
{
echo 'doSomethingElse';
}
}
/********************************
* 特征
*/
// 特征 從 PHP 5.4.0 開(kāi)始包括,需要用 "trait" 這個(gè)關(guān)鍵字聲明
trait MyTrait
{
public function myTraitMethod()
{
print 'I have MyTrait';
}
}
class MyTraitfulClass
{
use MyTrait;
}
$cls = new MyTraitfulClass();
$cls->myTraitMethod(); // 輸出 "I have MyTrait"
/********************************
* 命名空間
*/
// 這部分是獨(dú)立于這個(gè)文件的
// 因?yàn)槊臻g必須在一個(gè)文件的開(kāi)始處。
<?php
// 類會(huì)被默認(rèn)的放在全局命名空間中,可以被一個(gè)\來(lái)顯式調(diào)用
$cls = new \MyClass();
// 為一個(gè)文件設(shè)置一個(gè)命名空間
namespace My\Namespace;
class MyClass
{
}
// (或者從其他文件中)
$cls = new My\Namespace\MyClass;
//或者從其他命名空間中
namespace My\Other\Namespace;
use My\Namespace\MyClass;
$cls = new MyClass();
// 你也可以為命名空間起一個(gè)別名
namespace My\Other\Namespace;
use My\Namespace as SomeOtherNamespace;
$cls = new SomeOtherNamespace\MyClass();
*/
訪問(wèn)?PHP 官方文檔
如果你對(duì)最佳實(shí)踐感興趣(實(shí)時(shí)更新)?PHP The Right Way.
如果你很熟悉善于包管理的語(yǔ)言?Composer.
如要了解通用標(biāo)準(zhǔn),請(qǐng)?jiān)L問(wèn)PHP Framework Interoperability Group’s?PSR standards.
更多建議: