1.本文主要針對有C語言(或其他編程語言)基礎的人快速學習PHP的,所以不會對一些基礎知識作過多解釋,比如“=”是賦值不是等於。
2.本文適合已學過一門編程語言,想要快速入門PHP的人。
3.基本上看完本文即可入門,可以動手實踐或是進階。
PHP是Hypertext Preprocessor(超文本預處理器)的遞歸縮寫。
這是一種特別適合網頁開發的服務器端腳本語言。
它是運行在服務器上的腳本,因此不能直接用浏覽器打開.php腳本,需要服務器解析後發送給浏覽器才能查看網頁內容。因此要在浏覽器裡輸入地址訪問.php文件,然後服務器解析後發送給浏覽器解析後的Html,才能查看網頁內容。
如果要在自己電腦上運行.php文件,需要先搭建配置服務器環境,初學者可以使用集成服務器組件,比如XAMPP,下載地址:https://www.apachefriends.org/zh_cn/index.html
這部分不作過多介紹,大家可以去百度。
PHP可以內嵌在Html文檔中的任何位置。
PHP 腳本以<?php
開頭,以 ?>
結尾。
例:
<!DOCTYPE html>
<html>
<body>
<h1>我的第一張 PHP 頁面</h1>
<?php
echo 'Hello World!'; // 輸出 Hello World!
?>
</body>
</html>
PHP支持C、C++、Perl三種風格的注釋:
<?php
echo 'This is a test'; // This is a one-line c++ style comment
/* This is a multi line comment
yet another line of comment */
echo 'This is yet another test';
echo 'One Final Test'; # This is a one-line shell-style comment
?>
PHP只有變量大小寫敏感。
所有用戶定義的函數、類和關鍵詞(例如 if、else、echo 等等)都對大小寫不敏感。
PHP變量以$符號開頭。
PHP是弱類型語言,無需聲明類型。
PHP變量名稱大小寫敏感。
函數之外聲明的變量擁有 Global 作用域,只能在函數以外進行訪問。
函數內部聲明的變量擁有 LOCAL 作用域,只能在函數內部進行訪問。
例:
<?php
$x=5; // 全局作用域
function myTest() {
$y=10; // 局部作用域
echo "<p>測試函數內部的變量:</p>";
echo "變量 x 是:$x"; // 輸出 變量x是:
echo "<br>";
echo "變量 y 是:$y"; // 輸出 變量y是:10
}
myTest();
echo "<p>測試函數之外的變量:</p>";
echo "變量 x 是:$x"; // 輸出 變量x是:5
echo "<br>";
echo "變量 y 是:$y"; // 輸出 變量y是:
?>
在函數內訪問Global變量使用global
關鍵字。
例:
<?php
$x=5;
$y=10;
function myTest() {
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; // 輸出 15
?>
也可以使用$GLOBALS超全局變量訪問全局變量:
例:
<?php
$x=5;
$y=10;
function myTest() {
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y; // 輸出 15
?>
static
關鍵字聲明靜態變量。
當函數完成/執行後,不會刪除靜態變量。
超全局變量 在 PHP 4.1.0 中引入,是在全部作用域中始終可用的內置變量。在函數或方法中無需執行 global $variable; 就可以訪問它們。
$GLOBALS— 引用全局作用域中可用的全部變量
$_SERVER— 服務器和執行環境信息
$_REQUEST— HTTP Request 變量
$_POST— HTTP POST 變量
$_GET— HTTP GET 變量
$_FILES— HTTP 文件上傳變量
$_ENV— 環境變量
$_COOKIE— HTTP Cookies
$_SESSION— Session 變量
官方文檔
可變變量是一種獨特的變量,它允許動態改變一個變量名稱。其工作原理是,該變量的名稱由另外一個變量的值來確定。
例:
<?php
$a = 'hello';
$$a = 'world';
?>
以上代碼定義了兩個變量,$a='hello',$hello='world'。
官方文檔
在 PHP 中,有兩種基本的輸出方法:echo 和 print。
echo - 能夠輸出一個以上的字符串
print - 只能輸出一個字符串,並始終返回 1
echo 比 print 稍快,因為它不返回任何值
echo 是一個語言結構,有無括號均可使用:echo 或 echo()。
print 也是語言結構,有無括號均可使用:print 或 print()。
字符串、整數、浮點數、布爾、數組、對象、NULL。
PHP字符串可以用單引號也可以用雙引號。
單引號和雙引號的區別是:雙引號會解析裡面的變量和轉義字符,而單引號不會,單引號裡的字符僅僅只有\(反斜槓)和'(單引號本身)需要轉義:
$str='Hello';
echo 'I\'ll say $str\n';
// 輸出 I'll say $str\n
echo "I\'ll say $str\n";
// 輸出 I'll say Hello
?>
建議使用單引號表示字符串,除非需要解析裡面的變量。
heredoc & nowdoc
需要表示特別長的字符串的時候,可以使用heredoc和nowdoc語法,heredoc和nowdoc語法的區別相當於雙引號和單引號的區別。
/*heredoc 語法
1. 由<<<標記名......標記名包圍組成
2. 開始標記和結束標記名稱要一致
3. 結束標記必須頂格寫
4. 主體部分,會自動解析變量和轉義字符
5. 但是函數、操作符和引號則不會被解析
*/
$str = 'hello world';
echo <<
Hello World
$str
HTML;
?>
<?php
/*nowdoc 語法
1. 區別就是開始標記名要加單引號,但結束標記名不要加單引號
2. 主體部分的變量和轉義字符不會被解析
*/
echo <<<'HTML'
<html>
<head>
<title>Hello World</title>
</head>
<body>
<p>hello world</p>
</body>
</html>
HTML;
?>
heredoc和nowdoc特別適合輸出很長的HTML文檔,比直接以字符串的形式輸出要容易閱讀得多。
PHP數組其實一組鍵值對(key/value)。
創建數組:
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
或
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";
也可以不指定鍵值(key),那麼默認的索引就是從0開始的有序數字:
$cars=array("Volvo","BMW","SAAB",6=>"Audi","Daewoo");
相當於:
$cars[0]="Volvo";
$cars[1]="BMW";
$cars[2]="SAAB";
$cars[6]="Audi";
$cars[7]="Daewoo";
遍歷數組:
<?php
$age=array("Bill"=>"35","Steve"=>"37","Peter"=>"43");
foreach($age as $x=>$x_value) {
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
當然也可以用for循環,count()返回數組元素個數:
<?php
$cars = array("Volvo", "BMW", "Toyota");
$arrlength = count($cars);
for($x = 0; $x < $arrlength; $x++) {
echo $cars[$x];
echo "<br>";
}
?>
常量是一個固定值的標識符。
有效的常量名以字符或下劃線開頭(常量名稱前面沒有 $ 符號)。
常量默認是大小寫敏感的。
通常,常量全部使用大寫字母。
與變量不同,常量貫穿整個腳本是自動全局的。
使用 define() 函數設置常量:
<?php
define("FOO","something");
echo FOO;
?>
加減乘除取余,自加自減和C語言一樣。
連接兩個字符串用“.”。
$str='and';
$str='something'.$str; // somethingand
和C語言基本相同,不同之處:
// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1
// Arrays
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1
// Objects
$a = (object) ["a" => "b"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 0
$a = (object) ["a" => "b"];
$b = (object) ["a" => "c"];
echo $a <=> $b; // -1
$a = (object) ["a" => "c"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 1
// only values are compared
$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
echo $a <=> $b; // 1
?>
基本和C語言一樣,不同之處:
和弱類型語言JavaScript語法差不多,以function關鍵字開頭,執行可以在定義的前面:
function function_name(){
// TODO:
}
參數可以有默認值
function setHeight($minheight=50) {
echo "The height is : $minheight ";
}
setHeight(350);
setHeight(); // 將使用默認值 50
setHeight(135);
setHeight(80);
?>
參數可以使用引用傳遞,從而形參和實參指向同一塊內存:
$x=1;
$y=2;
function exchange(&$x,&$y){
$temp=$x;
$x=$y;
$y=$temp;
}
exchange($x,$y);
// $x,$y的值被交換了
// 調用函數的時候參數前面不要加&
?>
函數可以返回引用,如果要返回引用,函數聲明時要加&,將返回的引用賦值給一個變量時也要加&:
function &test()
{
static $b=0;//申明一個靜態變量
$b=$b+1;
echo $b;
return $b;
}
$a=test();//這條語句會輸出 $b的值 為1
$a=5;
$a=test();//這條語句會輸出 $b的值 為2
$a=&test();//這條語句會輸出 $b的值 為3
$a=5;
$a=test();//這條語句會輸出 $b的值 為6
?>
require和include可以將 PHP 文件的內容插入另一個 PHP 文件(在服務器執行它之前)。
包含可用於創建可在多個頁面重復使用的函數、頁眉、頁腳或元素。
語法,加上文件名即可,或者加上括號:
require 'file.php';
require ('file.txt');
include 'file.txt';
include ('file.php');
區別:
錯誤處理不同,require 會生成致命錯誤(E_COMPILE_ERROR)並停止腳本,include 只生成警告(E_WARNING),並且腳本會繼續
使用彈性不同,require通常放在PHP程序的最前面,PHP程序在執行前會先讀入require所指定引入的檔案,使它變成程序網頁的一部分;include通常放在流程控制處理中,PHP程序讀到include的檔案時,才將它讀進來。
和require、include的區別就是:如果該文件中的代碼已經被包括了,則不會再次包括。
class phpClass {
var $var1;
var $var2 = "constant string";
function myfunc ($arg1, $arg2) {
[..]
}
[..]
}
?>
類使用 class 關鍵字後加上類名定義。
類名後的一對大括號({})內可以定義變量和方法。
類的變量使用 var 來聲明, 變量也可以初始化值。
函數定義類似 PHP 函數的定義,但函數只能通過該類及其實例化的對象訪問。
栗子:
/**
* Define MyClass
*/
class MyClass
{
// 聲明一個公有的構造函數
public function __construct() { }
// 聲明一個公有的方法
public function MyPublic() { }
// 聲明一個受保護的方法
protected function MyProtected() { }
// 聲明一個私有的方法
private function MyPrivate() { }
// 此方法為公有
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // 這行能被正常執行
$myclass->MyProtected(); // 這行會產生一個致命錯誤
$myclass->MyPrivate(); // 這行會產生一個致命錯誤
$myclass->Foo(); // 公有,受保護,私有都可以執行
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 此方法為公有
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // 這行會產生一個致命錯誤
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 這行能被正常執行
$myclass2->Foo2(); // 公有的和受保護的都可執行,但私有的不行
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>
構造函數是名為__construct的函數,它有兩個下劃線。
析構函數是名為__destruct的函數,它有兩個下劃線。
默認訪問權限是public。
使用->訪問類的成員。
parent關鍵字表示父類。
final關鍵字表示該函數不能重載。
static修飾的方法和屬性可以不實例化就訪問。
abstract關鍵字修飾抽象類,抽象類不能實例化。
這部分以後再寫吧。
讀到這裡語法基本就已掌握,可以進行一些實戰了。