配置sublime
{
"cmd": ["php", "$file"],
"file_regex": "php$",
"selector": "source.php"
}
代碼執行個體
<?php
echo "hello world"
# 單行注釋
// 單行注釋
/*
多行注釋
*/
?>
基礎文法
<?php
// 八種資料類型: 整型 浮點型 布爾值 空 字元串 數組 對象 資源
// PHP所有變量有一個美元符号($)
// 變量指派
$name = "Tom";
echo $name;
// 變量指派多行内容
$detail = "\nthis is first line
this is second line\n";
echo $detail;
// 全局變量
$a = 20;
function global_func(){
// print($a); // Undefined variable
global $a; // 通路全局變量
print($a); // 20
$GLOBALS['a'] += 30; // 修改全局變量
echo "\n";
}
global_func();
print($a); // 50
echo "\n";
// 靜态變量
function static_func(){
static $a = 1;
echo "a=";
echo $a;
echo "\n";
$a += 1;
}
static_func(); // a=1
static_func(); // a=2
static_func(); // a=3
// 常量定義
define("MAX", 20);
// 常量通路
print MAX; // 20
print "\n";
print(constant("MAX")); // 20
print "\n";
// PHP比較運算符 == ===(值和類型都相同) <> != !==(值不同或類型不同)
?>
<?php
// 結構控制
if (1 < 2){
print("1<2");
}
else{
print("1>=2");
}
print "\n";
// 1<2
// 循環類型
// 有4種方式:for、while、do...while、foreach,前面3種和C語言中類似
for($i=1; $i<=3; $i++){
print($i);
print "\n";
}
// 1 2 3
$i = 1;
while ($i<=3) {
print $i;
print " ";
$i++;
}
print "\n";
// 1 2 3
do{
print $i;
print " ";
$i--;
} while($i>0);
print "\n";
// 4 3 2 1
// 周遊數組, 指針移動
$list = array(1, 2, 3, 4, 5);
foreach ($list as $value) {
print "value = $value ";
}
print "\n";
// value = 1 value = 2 value = 3 value = 4 value = 5
// 數組 3種
// 數字數組
$numbers = array(1, 2, 3, 4, 5);
foreach ($numbers as $value) {
print("$value ");
}
print "\n";
// 1 2 3 4 5
// 修改數組元素
$numbers[0] = "one";
$numbers[1] = "two";
$numbers[2] = "three";
foreach ($numbers as $value) {
print("$value ");
}
print "\n";
// one two three 4 5
// 建立數組
$names[0] = 1;
$names[2] = 2;
foreach ($names as $value) {
print("$value ");
}
print "\n";
// 1 2
// 擷取數組長度
$length = count($numbers);
for($i=0; $i<$length; $i++){
print($numbers[$i]);
print(" ");
}
print "\n";
// one two three 4 5
// 關聯數組 PHP 5.5.36, 相當于python的字典
$people = ["Tom"=>"20", "Jack"=>"30", "Jimi"=>"40"];
// 通路數組元素
print($people["Tom"]);
print(" ");
print($people["Jack"]);
print(" ");
print($people["Jimi"]);
print("\n");
// 20 30 40
// 修改數組元素
$people["Tom"] = 50;
$people["Jack"] = 60;
$people["Jimi"] = 70;
// 周遊數組元素
foreach ($people as $key => $value) {
print("$key=>$value\n");
}
print("\n");
// Tom=>50
// Jack=>60
// Jimi=>70
// 多元數組
$cars = array(
"first" => [
"name" => "car1",
"color" => "white"
],
"second" => [
"name" => "car2",
"color" => "black"
]);
// 通路多元數組元素
print($cars["first"]["name"]); # car1
print("\n");
// PHP數組排序函數
/*
sort() - 對數組進行升序排列
rsort() - 對數組進行降序排列
asort() - 根據關聯數組的值,對數組進行升序排列
ksort() - 根據關聯數組的鍵,對數組進行升序排列
arsort() - 根據關聯數組的值,對數組進行降序排列
krsort() - 根據關聯數組的鍵,對數組進行降序排列
*/
// 字元串
// 雙引号串 中的内容可以被解釋而且替換
// 單引号串 中的内容總被認為是普通字元
// 字元串并置運算符(.):把兩個變量連接配接在一起
$a = "hello";
$b = "world";
print($a . " " . $b); // hello world
print("\n");
// 計算字元串的長度
$c = "中國";
print(strlen($a)); // 5
print(strlen($c)); // 6
// 查找字元串
print(strpos($a, "ll")); // 2
print(strpos($a, "xx")); // FALSE
print("\n");
// 函數
// $a普通參數, &$b引用參數, $c預設參數
function func_args($a, &$b, $c=2){
$a += 1;
$b += 1;
$c += 1;
print("a=$a b=$b c=$c\n"); // a=2 b=2 c=3
return $a; // 傳回值
}
$args_a = 1;
$args_b = 1;
$ret = func_args($args_a, $args_b);
print("ret=$ret\n"); // ret=2
print("args_a=$args_a args_b=$args_b\n");
// args_a=1 args_b=2
?>
面向對象
<?php
// 繼承 PHP不支援多繼承
/*
通路控制
public(公有):公有的類成員可以在任何地方被通路。
protected(受保護):受保護的類成員則可以被其自身以及其子類和父類通路。
private(私有):私有的類成員則隻能被其定義所在的類通路。
*/
// 類屬性必須定義為公有,受保護,私有之一, 預設為公有, var 定義,則被視為公有
// Final 關鍵字
// 方法被聲明為 final,則子類無法覆寫該方法。
// 如果一個類被聲明為 final,則不能被繼承。
class Father{
public $name = "Tom";
protected $age = 40;
private $address = "北京";
function print_info(){
print("public name: " . $this->name . "\n");
print("protected age: " . $this->age . "\n");
print("private address: " . $this->address . "\n");
}
final function work(){
print("龍生龍,鳳生鳳,老鼠生兒會打洞\n");
}
}
// 子類繼承父類
class Child extends Father{
protected $age = 20; // 重寫父類的protected屬性
function print_info(){
print("public name: " . $this->name . "\n");
print("protected age: " . $this->age . "\n");
// print("private address: " . $this->address . "\n"); // Undefined property
}
// function work(){
// print("子類不要父類的工作\n");
// }
// Cannot override final method
}
$father = new Father();
$father->print_info();
/*
public name: Tom
protected age: 40
private address: 北京
*/
$child = new Child();
$child->print_info();
/*
public name: Tom
protected age: 20
*/
// 構造函數和析構函數
class People{
function __construct($name){
$this->name = $name;
print("父類構造函數 " . $this->name);
}
function __destruct(){
print("父類析構函數");
}
}
class Human extends People{
function __construct($name){
parent::__construct($name); // 調用父類的構造方法
print("子類構造函數 " . $this->name);
}
}
$people = new People("老王");
print("\n");
/*
父類構造函數 老王
父類析構函數
*/
$human = new Human("小王");
print("\n");
// 父類構造函數 小王子類構造函數 小王 父類析構函數
// 接口
// 指定某個類必須實作哪些方法,但不需要定義這些方法的具體内容
// 接口中定義的所有方法都必須是公有,這是接口的特性
// 類可以實作多個接口
interface ISleep{
public function sleep($time);
}
interface IEat{
public function eat();
}
// 實作多接口
class Dog implements ISleep, IEat{
public function sleep($time){
print("sleep... time: $time\n");
}
public function eat(){
print("eating ...\n");
}
}
$dog = new Dog();
$dog->sleep(5);
$dog->eat();
/*
sleep... time: 5
eating ...
*/
// 抽象類
// 任何一個類,如果它裡面至少有一個方法是被聲明為抽象的,那麼這個類就必須被聲明為抽象的。
// 定義為抽象的類不能被執行個體化。
// 繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法
abstract class AbsBase{
// 抽象方法
abstract public function sleep();
// 普通方法
public function eat(){
print("eat...\n");
}
}
class Cat extends AbsBase{
public function sleep(){
print("cat sleep...\n");
}
}
class Pig extends AbsBase{
public function sleep(){
print("pig sleep...\n");
}
}
// $abs = new AbsBase(); // Cannot instantiate abstract class
$cat = new Cat();
$cat->eat(); // eat...
$cat->sleep(); // cat sleep...
$pig = new Pig();
$pig->eat(); // eat...
$pig->sleep(); // pig sleep...
// 靜态屬性 static
// 不執行個體化類而直接通路
class Foo{
public static $name = "static name";
public function get_name(){
print(self::$name); // 用一個變量來動态調用類的靜态屬性
print("\n");
}
}
print(Foo::$name); // static name // 通過類直接調用靜态屬性
$foo = new Foo();
$foo->get_name(); // static name
?>
參考
PHP快速入門