PHP

2018-02-24 15:18 更新

X分鐘速成Y

其中 Y=PHP

源代碼下載:?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.

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)