PHP基础——语法篇
1.PHP 腳本在服務器上執行,然后將純 HTML 結果發送回瀏覽器。
2.PHP 腳本可以放在文檔中的任何位置。
3.PHP 腳本以 <?php 開始,以 ?> 結束:
4.PHP 文件的默認文件擴展名是 ".php"。
5.PHP 文件通常包含 HTML 標簽和一些 PHP 腳本代碼。
6.注釋:
// 這是 PHP 單行注釋
/*
這是
PHP 多行
注釋
*/
PHP變量是什么?
1、在PHP中變量是用于儲存信息的容器,類似于數學中的集合。
2、賦值方法與數學中的代數相類似。
變量是用于存儲值的,我們命令服務器去干活的時候,往往需要產生一些數據,需要臨時性存放起來,方便取用。
我們也可以理解為,變量就像一個購物袋,我們可以用來裝蘋果、榴蓮(當然也可以用來裝玫瑰),
需要注意的是,一般情況下一個變量只能裝一個(不要太貪心)值,除非是復合變量(后面變量類型時會介紹),
當我們放進去一個蘋果后,再放進榴蓮的時候,蘋果就被替換掉,再放入香蕉,那么榴蓮就被替換了。
3.聲明:PHP 沒有聲明變量的命令。變量在您第一次賦值給它的時候被創建:
我們注意到,不必向 PHP 聲明該變量的數據類型。
在強類型的編程語言中,我們必須在使用變量前先聲明(定義)變量的類型和名稱。
4.局部和全局作用域:訪問機制,在 PHP 函數內部聲明的變量是局部變量,僅能在函數內部訪問:
但可以使用global 關鍵字用于函數內訪問全局變量
PHP 將所有全局變量存儲在一個名為 $GLOBALS[index] 的數組中。 index 保存變量的名稱。這個數組可以在函數內部訪問,也可以直接用來更新全局變量。
5.Static 作用域
當一個函數完成時,它的所有變量通常都會被刪除。然而,有時候您希望某個局部變量不要被刪除。
要做到這一點,請在您第一次聲明變量時使用 static 關鍵字:
6.超級全局變量(superglobals)
$GLOBALS //***********************組合數組:變量的名字就是數組的鍵。例如:
$x = 75;
$y = 25;
function addition() {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition(); //$z = 100
$_SERVER //******************* Web服務器創建:包含頭部(header)、路徑(path)、以及腳本位置(script locations)等【24個】重要元素信息的數組。
echo $_SERVER['PHP_SELF'];
echo $_SERVER['SERVER_NAME'];
echo $_SERVER['HTTP_HOST'];
echo $_SERVER['HTTP_REFERER'];
echo $_SERVER['HTTP_USER_AGENT'];
echo $_SERVER['SCRIPT_NAME'];
$_REQUEST //*******************收集HTML表單提交的數據,method="post"
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
有八個【魔術常量】它們的值隨著它們在代碼中的位置改變而改變。特殊的常量不區分大小寫
1【__LINE__】.文件中的當前行號:echo '這是第 “ ' . __LINE__ . ' ” 行';
2【__FILE__】文件的完整路徑和文件名:echo '該文件位于 “ ' . __FILE__ . ' ” ';
3【__DIR__】.文件所在的目錄:echo '該文件位于 “ ' . __DIR__ . ' ” ';
4【__FUNCTION__】返回該函數被定義時的名字(區分大小寫):echo '函數名為:' . __FUNCTION__ ;
function test() {
echo '函數名為:' . __METHOD__ ;//對比:該方法被定義時的名字 【__METHOD__】
}
5【__CLASS__】.返回該類被定義時的名字
class test {
function _print() {
echo '類名為:' . __CLASS__ . "<br>";//返回名稱
echo '函數名為:' . __FUNCTION__ ;
}
}
$t = new test();
$t->_print();
6【trait】.代碼復用
class Base {
public function sayHello() {//初始化
echo 'Hello ';
}
}
trait SayWorld { //代碼復用
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {//函數繼承
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();//Hello World! 當前類中的方法會覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法。
7【__NAMESPACE__】命名空間:在編譯時定義的名字
namespace MyProject;//最明確的目的就是解決重名問題
echo '命名空間為:"', __NAMESPACE__, '"'; // 輸出 "MyProject"
從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。
例如,在操作系統中目錄用來將相關文件分組,對于目錄中的文件來說,它就扮演了命名空間的角色。
具體舉個例子,文件 foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 文件。
另外,在目錄 /home/greg 外訪問 foo.txt 文件時,我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。
這個原理應用到程序設計領域就是命名空間的概念。
declare(encoding='UTF-8'); //定義多個命名空間和【不包含】在命名空間中的代碼
//************************************命名空間前出現了“<html>” 會致命錯誤
namespace MyProject\Sub\Level; //聲明分層次的單個命名空間
警告:如果命名空間中的函數或常量未定義,則該非限定的函數名稱或常量名稱會被解析為全局函數名稱或常量名稱。
相同點:
語言結構:使用的時候可以不用加括號,也可以加上括號: echo 或 echo()。
不同點:
echo - 可以輸出一個或多個字符串,echo 輸出的速度比 print 快, echo 沒有返回值
print - 只允許輸出一個字符串,返回值總為 1
<?php //字符串:并置運算符 (.) 用于把兩個字符串值連接起來。字符串函數包括:返回字符串的長度:strlen();返回第一個匹配的字符位置:strpos(),未找到返回 FALSE$txt1 = "a5678";$txt2 = "b4321";var_dump($x);echo $txt1 . " " . $txt2; "<br>"; //a5678b4321echo strlen("Hello world!"); //12echo strpos("Hello world!","world"); //6,從0開始計算,不是7//整數$x = -345; // 負數:int(-345)var_dump($x);echo "<br>"; $x = 0x8C; // 十六進制數:int(140)var_dump($x);echo "<br>";$x = 047; // 八進制數:int(39)var_dump($x);//浮點數$x = 10.365;var_dump($x);//float(10.365) echo "<br>"; $x = 2.4e3;var_dump($x);//float(2400) echo "<br>"; $x = 8E-5;var_dump($x);//float(8.0E-5) //布爾值$x=true;$y=false;//數組$cars=array("Volvo","BMW","Toyota");var_dump($cars);//array(3) { [0]=> string(5) "Volvo"....[2]=> string(6) "Toyota" }echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";//【對象】:在 PHP 中,對象必須必須使用class關鍵字聲明。類是可以包含屬性和方法的結構。class Car {var $color;function Car($color="green") {//設置屬性為color($this指代自己):$this->color$this->color = $color;}function what_color() {//設置屬性的值:$colorreturn $this->color;}}function print_vars($obj) {foreach (get_object_vars($obj) as $prop => $val) {echo "$prop = $val";}}//聲明對象$herbie = new Car("white");//調用對象的的方法print_vars($herbie);//常量define("GREETING", "歡迎訪問 php.cn", true);// 設為true,不區分大小寫的常量名echo greeting; // 不設置true,輸出的是自身,即字符串"greeting"echo GREETING; // 輸出 "歡迎訪問 php.cn"?> var_dump() 函數返回變量:數據類型(長度)和值
以上實例中PHP關鍵字this就是指向【當前對象實例的指針】,不指向任何其他對象或類。
設置常量,使用 define() 函數,常量在定義后,默認是全局變量,可以在整個運行的腳本的任何地方使用。
php數據類型包括:沒有Number
1.String(字符串),
2.Integer(整型),
3.Float(浮點型),
4.Boolean(布爾型),
5.Array(數組),
6.Object(對象),
7.NULL(空值)。
判斷語句:
if...else...
if (條件){
條件成立時執行的代碼;
}else{
條件不成立時執行的代碼;
}
switch 語句 - 在若干條件之一成立時執行一個代碼塊
<?php $x=10; $y=6;echo ($x + $y); // 輸出16echo "<br>";echo ($x - $y); // 輸出4echo "<br>";echo ($x * $y); // 輸出60echo "<br>";echo ($x / $y); // 輸出1.6666666666667echo "<br>"; echo ($x % $y); // 輸出4:模(除法的余數)echo (-$y); // -6,取反echo ($x . " " . $y);; // 輸出"106",拼接后變成字符串$x=10; echo ++$x; // 輸出11,預遞增echo "<br>";$y=10; echo $y++; // 輸出10,后遞增,不輸出遞增后的結果,類似for循環echo "<br>";$z=5;echo --$z; // 輸出4,預遞減echo "<br>";$i=5;echo $i--; // 輸出5,后遞減,不輸出遞減后的結果$x=100; $y="100";var_dump($x == $y);//等于echo "<br>";var_dump($x === $y);//恒等于echo "<br>";var_dump($x != $y);//不等于echo "<br>";var_dump($x !== $y);//不恒等于echo "<br>";$a=50;$b=90;var_dump($a >= $b);//falseecho "<br>";var_dump($a < $b);//true$x = array("a" => "red", "b" => "green"); $y = array("c" => "blue", "d" => "yellow"); $z = $x + $y; // $x 和 $y 數組合并?> 三元運算:(expr1) ? (expr2) : (expr3)
PHP7+ 支持組合比較符(運算符),實例如下:
// 整型:-1,0,1
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// 浮點型:-1,0,1
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// 字符串:-1,0,1
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
PHP中數組的key可以是字符串(js數組的key均指下標:數字),而values可以是任意類型。
//多維數組輸出格式:單箭頭->指代方法;雙箭頭=>指代取值key,如Array[0][php]
Array(
[php] => Array(
[0] => php中文網
[1] => http://www.php.cn
)
[google] => Array(
[0] => Google 搜索
[1] => http://www.google.com
)
[taobao] => Array(
[0] => 淘寶
[1] => http://www.taobao.com
)
)
//函數:排序
sort() - 對數組進行【升序】排列
asort() - 根據關聯數組的【值】,對數組進行升序排列
ksort() - 根據關聯數組的【鍵】,對數組進行升序排列
rsort() - 對數組進行【降序】排列
arsort() - 根據關聯數組的【值】,對數組進行降序排列
krsort() - 根據關聯數組的【鍵】,對數組進行降序排列
//【函數原理】:循環、遍歷,PHP提供了超過 1000 個內建的函數
1.函數的名稱應該提示出它的功能
2.函數名稱以字母或下劃線開頭(不能以數字開頭)
3.為了給函數添加更多的功能,我們可以添加參數。參數類似變量。
4.參數就在函數名稱后面有一個括號內指定。
5.如需讓函數返回一個值,請使用 return 語句。
while - 只要指定的條件成立,則循環執行代碼塊
$i=1;
while($i<=5){
echo "The number is " . $i . "<br>";//1,2,3,4,5
$i++;
}
do...while - 首先執行一次代碼塊,然后在指定的條件成立時重復這個循環
$i=1;
do{
$i++;
echo "The number is " . $i . "<br>";//2,3,4,5,6
}
while ($i<=5);
?
for - 循環執行代碼塊指定的次數
for (初始值; 條件; 增量){
要執行的代碼;
}
foreach - 根據數組中每個元素來循環代碼塊
每進行一次循環,當前數組元素的值就會被賦值給 $value 變量(數組指針會逐一地移動)
在進行下一次循環時,您將看到數組中的下一個值。
foreach ($array as $value){
要執行代碼;
}
$x=array("one","two","three");
foreach ($x as $value){
echo $value . "<br>";//"one","two","three"
}
什么是PHP面向對象?
在面向對象的程序設計(英語:Object-oriented programming,縮寫:OOP)中,
對象是一個由信息及對信息進行處理的描述所組成的整體,是對現實世界的抽象。
在現實世界里我們所面對的事情都是對象,如計算機、電視機、自行車等。
【對象的主要三個特性】:
對象的行為:可以對 對象施加那些操作,開燈,關燈就是行為。
對象的形態:當施加那些方法是對象如何響應,顏色,尺寸,外型。
對象的表示:對象的表示就相當于身份證,具體區分在相同的行為與狀態下有什么不同。
【類】 ? 定義了一件事物的抽象特點。類的定義包含了數據的形式以及對數據的操作。
1.類使用 class 關鍵字后加上類名定義。
2.類名后的一對大括號({})內可以定義變量和方法。
3.類的變量使用 var 來聲明, 變量也可以初始化值。
4.函數定義類似 PHP 函數的定義,但函數只能通過該類及其實例化的對象訪問。
5.定義為【抽象的類】不能被實例化。
/* 類的定義 */
class phpClass {
/* 成員變量 */
var $var1;
var $var2 = "constant string";
/* 成員函數 */
function myfunc ($arg1, $arg2) {
[..]
}
[..] //設置或獲取成員變量,調用成員函數!
}
/* 調用成員函數,【設置】、【獲取】標題和URL:$php->setTitle( "php中文網" ) */
【對象】 ? 是類的實例。如:人的標簽實例【高富帥】、車的標簽實例【寶馬】
【成員變量】 ? 定義在類內部的變量。該變量的值對外是不可見的,但是可以通過成員函數訪問,在類被實例化為對象后,該變量即可稱為對象的屬性。
【成員函數】 ? 定義在類的內部,可用于訪問對象的數據。
【繼承】 ? 繼承性是子類自動共享父類數據結構和方法的機制,這是類之間的一種關系。在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,并加入若干新的內容。
PHP 使用關鍵字 extends 來繼承一個類,PHP 不支持多繼承
class Child extends Parent {
// 代碼部分
}
【父類】 ? 一個類被其他類繼承,可將該類稱為父類,或基類,或超類。
1.如果父類中的方法被聲明為 【final】,則子類無法覆蓋
class BaseClass {
public function test() {
echo "BaseClass::test() called" . PHP_EOL;
}
final public function moreTesting() { //不可覆蓋moreTesting!!!
echo "BaseClass::moreTesting() called" . PHP_EOL;
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called" . PHP_EOL;//報錯!!!
}
}
【子類】 ? 一個類繼承其他類稱為子類,也可稱為派生類。
1.子類要執行父類的構造方法,需要在子類的構造方法中調用 parent::__construct() 。
class BaseClass {
function __construct() {
print "BaseClass 類中構造方法" . PHP_EOL;
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct(); // 【子類構造方法不能自動調用父類的構造方法,類似surper()】
print "SubClass 類中構造方法" . PHP_EOL;
}
}
class OtherSubClass extends BaseClass {
// 繼承 BaseClass 的構造方法
}
// 調用 BaseClass 構造方法
$obj = new BaseClass();
// 調用 BaseClass、SubClass 構造方法
$obj = new SubClass();
// 調用 BaseClass 構造方法
$obj = new OtherSubClass();
【多態】 ? 多態性是指相同的操作或函數、過程可作用于多種類型的對象上并獲得不同的結果。不同的對象,收到同一消息可以產生不同的結果,這種現象稱為多態性。
【重載】 ? 簡單說,就是函數或者方法有同樣的名稱,但是參數列表不相同的情形,這樣的同名不同參數的函數或者方法之間,互相稱之為重載函數或者方法。
【抽象性】 ? 抽象性是指將具有一致的數據結構(屬性)和行為(操作)的對象抽象成類。一個類就是這樣一種抽象,它反映了與應用有關的重要性質,而忽略其他一些無關內容。任何類的劃分都是主觀的,但必須與具體的應用有關。
【封裝】 ? 封裝是指將現實世界中存在的某個客體的屬性與行為綁定在一起,并放置在一個邏輯單元內。
【構造函數】 ? 主要用來在創建對象時初始化對象, 即為對象成員變量賦初始值,總與new運算符一起使用在創建對象的語句中。
void __construct ([ mixed $args [, $... ]] )
function __construct( $par1, $par2 ) {
$this->url = $par1;//不需要再調用 setTitle 和 setUrl 方法了:
$this->title = $par2;//即為對象成員變量賦初始值
}
【析構函數】 ? 析構函數(destructor) 與構造函數相反,當對象結束其生命周期時(例如對象所在的函數已調用完畢),系統自動執行析構函數。析構函數往往用來做"清理善后" 的工作(例如在建立對象時用new開辟了一片內存空間,應在退出前在析構函數中用delete釋放)。
void __destruct ( void )
class MyDestructableClass {
function __construct() {
print "構造函數\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "銷毀 " . $this->name . "\n";//銷毀 MyDestructableClass
}
}
$obj = new MyDestructableClass();
【訪問控制】對屬性或方法的訪問控制,是通過在前面添加關鍵字 public(公有),protected(受保護)或 private(私有)來實現的。如果沒有設置這些關鍵字,則該方法默認為公有。
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(); // 公有,受保護,私有都可以執行
【接口】使用接口(interface),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。
接口是通過 【interface】關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。
接口中定義的所有方法都必須是【公有】,這是接口的特性。
要實現一個接口,使用 【implements】 操作符。類中必須【實現接口中定義的所有方法】,否則會報一個致命錯誤。類可以實現多個接口,用【逗號】來分隔多個接口的名稱。
// 聲明一個'iTemplate'接口
interface iTemplate{
public function setVariable($name, $var);
public function getHtml($template);
}
// 實現接口
class Template implements iTemplate{
private $vars = array();
public function setVariable($name, $var){
$this->vars[$name] = $var;
}
public function getHtml($template){
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
【Static 關鍵字】:“靜態的”,由于靜態方法不需要通過對象即可調用
1.偽變量 $this 在靜態方法中不可用。
2.靜態屬性不可以由對象通過 -> 操作符來訪問,可以使用域運算符【::】,一般用于在B類對象中使用A類對象的屬性/方法!
3.可以用一個變量來動態調用類。但該變量的值不能為關鍵字 self,parent 或 static。
class Foo {
public static $my_static = 'foo';//靜態變量:$my_stati
public function staticValue() {
return self::$my_static;//訪問靜態變量
}
}
print Foo::$my_static . PHP_EOL;//訪問靜態變量
$foo = new Foo();
print $foo->staticValue() . PHP_EOL;
?
轉載于:https://www.cnblogs.com/wheatCatcher/p/11215713.html
總結
以上是生活随笔為你收集整理的PHP基础——语法篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jeecms系统_自定义对象流程
- 下一篇: php中static和self的区别