PHP 基礎知識總結大全-菜鳥入門級詳解

目錄:

PHP官網:https://www.php.net/

一:PHP能做什麼

二:安裝

三:PHP開發工具

3.1:PHP服務器組件

3.2:PHP IDE(Integrated Development Environment,集成開發環境)

3.3:MySql管理工具

3.4:文本編輯器

四:PHP基本語法

4.1:PHP echo 和 print 語句

4.2:PHP變量

4.3:PHP 是一門弱類型語言

4.4:PHP變量的作用域(全局和局部作用域)

4.4.1 :global 關鍵字

4.4.2:$GLOBALS[index] 數組

4.4.3:Static 作用域

4.4.4:超級全局變量

4.4.4.1:$GLOBAL ($global)

4.4.4.2:$_SERVER ($_server)

4.4.4.3:$_REQUEST ($_request)

4.4.4.4:$_POST

4.4.4.5:$_GET

4.5:PHP5數據類型

4.5.1:字符串

4.5.2:整型

4.5.3:浮點型

4.5.4:布爾型

4.5.5:數組

4.5.6:對象

4.5.7:NULL 值

4.6:常量

4.7:運算符

4.8:流程控制語句 同js

4.9:數組

  4.9.1:數組排序

   4.10:PHP 函數

   4.11:魔術變量

   4.11.1 _LINE__(_line_)文件中的當前行號

   4.11.2 FILE(file)

文件的完整路徑和文件名。

如果用在被包含文件中,則返回被包含的文件名。

   4.11.3 DIR(dir)文件所在的目錄。

如果用在被包括文件中,則返回被包括的文件所在的目錄。

   4.11.4 FUNCTION(function)函數名稱(PHP 4.3.0 新加)

   4.11.5 CLASS 類的名稱(PHP 4.3.0 新加)

   4.11.6 TRAIT( Trait )的名字(PHP 5.4.0 新加)

    4.11.7 METHOD(method) 類的方法名(PHP 5.0.0 新加)

    4.11.8 NAMESPACE (mamespace)

4.12:命名空間

    4.12.1:PHP 命名空間可以解決以下兩類問題:

    4.12.2:命名空間使用PHP 命名空間中的類名可以通過三種方式引用:

    4.12.3: 命名空間和動態語言特徵

    4.12.4 使用命名空間:後備全局函數/常量

4.13 PHP文件處理

4.14: 函數

4.15:PHP JSON


PHP官網:https://www.php.net/

一:PHP能做什麼

PHP 可以生成動態頁面內容
PHP 可以創建、打開、讀取、寫入、關閉服務器上的文件
PHP 可以收集表單數據
PHP 可以發送和接收 cookies
PHP 可以添加、刪除、修改您的數據庫中的數據
PHP 可以限制用戶訪問您的網站上的一些頁面
PHP 可以加密數據

二:安裝

如果您的服務器不支持 PHP,您必須:

  1. 安裝 Web 服務器
  2. 安裝 PHP
  3. 安裝數據庫,比如 MySQL
    官方 PHP 網站(PHP.net)有 PHP 的安裝說明: http://php.net/manual/en/install.php

集成開發環境推薦 WAMP:http://www.wampserver.com/

 

三:PHP開發工具

PHP 開發工具其實包括以下四種:

  • PHP服務器組件。
  • PHP IDE(Integrated Development Environment,集成開發環境)。
  • MySql管理工具
  • 文本編輯器
  •  

3.1:PHP服務器組件

PHP服務器組件非常多有WampServer、XAMPP、AppServ、phpStudy、phpnow等。

菜鳥教程推薦: WampServer,這也是目前window平臺上使用最廣泛的,操作也非常簡單。

WampServer內部還集成了PhpMyAdmin 數據庫管理工具。

下載地址:http://www.wampserver.com/en/#download-wrapper

 

3.2:PHP IDE(Integrated Development Environment,集成開發環境)

PHP IDE 也是非常多有Zend Studio、Eclipse for PHP、EasyEclipse等。

菜鳥教程推薦:easyeclipse for php

下載地址:http://www.easyeclipse.org/site/distributions/php.html

 

3.3:MySql管理工具

MySql管理工具常用的有:Navicat for Mysql、PhpMyAdmin。

菜鳥教程推薦:Navicat for Mysql,Navicat for MySQL是一套專爲MySQL設計的強大數據庫管理及開發工具。它可以用於任何3.21或以上的MySQL數據庫服務器,並支持大部份MySQL最新版本的功能,包括觸發器、存儲過程、函數、事件、檢索、權限管理等等。

下載地址:http://www.navicat.com.cn/download/navicat-for-mysql

 

 

3.4:文本編輯器

如果你已經能夠熟練掌握PHP的語法,那你可以逐漸拋棄那些笨重的IDE,使用文本編輯器來編寫PHP代碼。

常用的編輯器有:Notepad++、editplus、ultraedit等。

菜鳥教程推薦:Notepad++

下載地址:http://notepad-plus-plus.org/download/

 

四:PHP基本語法

PHP 腳本可以放在文檔中的任何位置。

PHP 腳本以 <?php 開始,以 ?> 結束:

<!DOCTYPE html>
<html>
<body>

<h1>我的第一個 PHP 頁面</h1>

<?php
echo "Hello World!";

// 這是一行註釋

/*
這是
多行
註釋
*/

?>

</body>
</html>

PHP 中的每個代碼行都必須以分號結束

兩種在瀏覽器輸出文本的基礎指令:echo 和 print。

 

4.1:PHP echo 和 print 語句

  • echo - 可以輸出一個或多個字符串
  • print - 只允許輸出一個字符串,返回值總爲 1

提示:echo 輸出的速度比 print 快, echo 沒有返回值,print有返回值1。


echo 和 print 都是一個語言結構,使用的時候可以不用加括號,也可以加上括號: echo 或 echo() print print()。

<?php
echo "<h2>PHP is fun!</h2>";
echo "Hello world!<br>";
echo "I'm about to learn PHP!<br>";
echo "This", " string", " was", " made", " with multiple parameters.";

print "<h2>PHP is fun!</h2>";
print "Hello world!<br>";
print "I'm about to learn PHP!";

?>

下面的實例演示瞭如何使用 echo 命令輸出變量和字符串

<?php
$txt1="Learn PHP";
$txt2="runoob.com";
$cars=array("Volvo","BMW","Toyota");

echo $txt1;
echo "<br>";
echo "Study PHP at $txt2"; //php 雙引號內部可包含變量
echo "My car is a {$cars[0]}"; //用大括號 顯式的指定這是變量

$txt1="Learn PHP";
$txt2="runoob.com";
$cars=array("Volvo","BMW","Toyota");

print $txt1;
print "<br>";
print "Study PHP at $txt2";
print "My car is a {$cars[0]}";

?>

 

4.2:PHP變量

變量以 $ 符號開始,後面跟着變量的名稱

PHP 沒有聲明變量的命令。

變量在您第一次賦值給它的時候被創建:

 

4.3:PHP 是一門弱類型語言


PHP 會根據變量的值,自動把變量轉換爲正確的數據類型。

在強類型的編程語言中,我們必須在使用變量前先聲明(定義)變量的類型和名稱。

 

4.4:PHP變量的作用域(全局和局部作用域)

PHP 有四種不同的變量作用域:

  • local
  • global
  • static
  • parameter

在所有函數外部定義的變量,擁有全局作用域。

除了函數外,全局變量可以被腳本中的任何部分訪問,要在一個函數中訪問一個全局變量,需要使用 global 關鍵字

在 PHP 函數內部聲明的變量是局部變量,僅能在函數內部訪問:

<?php
$x=5; // 全局變量

function myTest()
{
    $y=10; // 局部變量
    echo "<p>測試變量在函數內部:<p>";
    echo "變量 x 爲: $x";
    echo "<br>";
    echo "變量 y 爲: $y";
} 

myTest();

echo "<p>測試變量在函數外部:<p>";
echo "變量 x 爲: $x";
echo "<br>";
echo "變量 y 爲: $y";
?>

4.4.1 :global 關鍵字

在函數內調用函數外定義的全局變量,我們需要在函數中的變量前加上 global 關鍵字:

<?php
$x=5;
$y=10;

function myTest()
{
    global $x,$y;
    $y=$x+$y;
}

myTest();
echo $y; // 輸出 15
?>

4.4.2:$GLOBALS[index] 數組

PHP 將所有全局變量存儲在一個名爲 $GLOBALS[index] 的數組中。 index 保存變量的名稱。這個數組可以在函數內部訪問,也可以直接用來更新全局變量。

<?php
$x=5;
$y=10;

function myTest()
{
    $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
} 

myTest();
echo $y;
?>

 

4.4.3:Static 作用域

當一個函數完成時,它的所有變量通常都會被刪除。然而,有時候您希望某個局部變量不要被刪除,可以使用 static關鍵字

<?php

function myTest()
{
    static $x=0;
    echo $x;
    $x++;
}

myTest();
myTest();
myTest();

?>

4.4.4:超級全局變量

PHP中預定義了幾個超級全局變量(superglobals) ,這意味着它們在一個腳本的全部作用域中都可用。

共九個:

  • $GLOBALS
  • $_SERVER
  • $_REQUEST
  • $_POST
  • $_GET
  • $_COOKIE
  • $_FILES
  • $_ENV
  • $_SESSION

4.4.4.1:$GLOBAL ($global)

是一個包含了全部變量的全局組合數組。

變量的名字就是數組的鍵。

<?php 
$x = 75; 
$y = 25;
 
function addition() 
{ 
    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
}
 
addition(); 
echo $z; 
?>

4.4.4.2:$_SERVER ($_server)

是一個包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等等信息的數組。這個數組中的項目由 Web 服務器創建。不能保證每個服務器都提供全部項目;

<?php 
echo $_SERVER['PHP_SELF']; // /try/demo_source/demo_global_server.php
echo "<br>";
echo $_SERVER['SERVER_NAME']; // runoob.com
echo "<br>";
echo $_SERVER['HTTP_HOST']; // www.runoob.com
echo "<br>";
echo $_SERVER['HTTP_REFERER']; //來由
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT']; //瀏覽器
echo "<br>";
echo $_SERVER['SCRIPT_NAME']; // /try/demo_source/demo_global_server.php

//另外$_SERVER對象還包括 SERVER_ADDR, SERVER_PROTOCOL ,REQUEST_METHOD..等屬性

?>

4.4.4.3:$_REQUEST ($_request)

用於收集HTML表單提交的數據。

<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>

<?php 
$name = $_REQUEST['fname']; 
echo $name; 
?>

</body>
</html>

4.4.4.4:$_POST

被廣泛應用於收集表單數據,在HTML form標籤的指定該屬性:"method="post"

<html>
<body>
<!--頁面post給自己-->
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>

<?php 
$name = $_POST['fname']; 
echo $name; 
?>

</body>
</html>

 

4.4.4.5:$_GET

同樣被廣泛應用於收集表單數據,在HTML form標籤的指定該屬性:"method="get"。

$_GET 也可以收集URL中發送的數據。

<html>
<body>

<a href="test_get.php?subject=PHP&web=runoob.com">Test $GET</a>

</body>
</html>

//test_get.php

<html>
<body>

<?php 
echo "Study " . $_GET['subject'] . " at " . $_GET['web'];
?>

</body>
</html>

 

4.5:PHP5數據類型

7種:

String(字符串),

Integer(整型),

Float(浮點型),

Boolean(布爾型),

Array(數組),

Object(對象),

NULL(空值)。

4.5.1:字符串

你可以將任何文本放在單引號和雙引號中:

單引號 包括字符串字面量 
雙引號包含的字符串 可包含變量
<?php 
$x = "Hello world!";
echo $x;
echo "<br>"; 
$x = 'Hello world!'; //單引號 包括字符串字面量 雙引號包含的字符串 可包含變量
echo $x;
?>

4.5.2:整型

在以下實例中我們將測試不同的數字。 PHP var_dump() 函數返回變量的數據類型和值:

?php 
$x = 5985;
var_dump($x);
echo "<br>"; 
$x = -345; // 負數 
var_dump($x);
echo "<br>"; 
$x = 0x8C; // 十六進制數
var_dump($x);
echo "<br>";
$x = 047; // 八進制數
var_dump($x);
?>

4.5.3:浮點型

<?php 
$x = 10.365;
var_dump($x);
echo "<br>"; 
$x = 2.4e3;
var_dump($x);
echo "<br>"; 
$x = 8E-5;
var_dump($x);
?>

4.5.4:布爾型

布爾型可以是 TRUE 或 FALSE。

4.5.5:數組

數組可以在一個變量中存儲多個值

<?php 
$cars=array("Volvo","BMW","Toyota");
var_dump($cars);
?>

4.5.6:對象

在 PHP 中,對象必須聲明。

首先,你必須使用class關鍵字聲明類對象。

類是可以包含屬性和方法的結構。
然後我們在類中定義數據類型,然後在實例化的類中使用數據類型:

<?php
class Car
{
    var $color;
    function Car($color="green") {
      $this->color = $color;
    }
    function what_color() {
      return $this->color;
    }
}

function print_vars($obj) {
   foreach (get_object_vars($obj) as $prop => $val) {
     echo "\t$prop = $val\n";
   }
}

// instantiate one object
$herbie = new Car("white");

// show herbie properties
echo "\herbie: Properties\n";
print_vars($herbie);

?>  

4.5.7:NULL 值

NULL 值表示變量沒有值。NULL 是數據類型爲 NULL 的值。

<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>

4.6:常量

常量是一個簡單值的標識符。

該值在腳本中不能改變。 (常量名不需要加 $ 修飾符)。

注意: 常量在整個腳本中都可以使用。

設置常量,使用 define() 函數,函數語法如下:

define(string constant_name, mixed value, case_sensitive = true)
該函數有三個參數:

  • constant_name:必選參數,常量名稱,即標誌符。
  • value:必選參數,常量的值
  • case_sensitive:可選參數,指定是否大小寫敏感,設定爲 true 表示不敏感。

 

以下實例我們創建一個 區分大小寫的常量, 常量值爲 "Welcome to runoob.com!":

<?php
define("GREETING", "Welcome to runoob.com!");
echo GREETING;
?>

字符串函數和字符串連接

字符串連接運算符

strlen:獲取字符串長度

strpos:獲取子串位置

<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2; // 字符串連接運算符 .

echo strlen("Hello world!"); //獲取字符串長度
echo strpos("Hello world!","world"); //獲取子串位置
//字符串中第一個字符的位置是 0
?>

4.7:運算符

<?php
//其他運算符略..
//邏輯運算符 ! && || and or xor
//數組運算符 合併: + 比較:== != === !==
$x = array("a" => "red", "b" => "green"); 
$y = array("c" => "blue", "d" => "yellow"); 
$z = $x + $y; // $x 和 $y 數組合並
var_dump($z);
var_dump($x == $y);
var_dump($x === $y);
var_dump($x != $y);
var_dump($x <> $y);
var_dump($x !== $y);
?>

4.8:流程控制語句 同js

<?php

$t=date("H");
if ($t<"20")
{
    echo "Have a good day!";
}



$t=date("H");
if ($t<"20")
{
    echo "Have a good day!";
}
else
{
    echo "Have a good night!";
}

$t=date("H");
if ($t<"10")
{
    echo "Have a good morning!";
}
else if ($t<"20")
{
    echo "Have a good day!";
}
else
{
    echo "Have a good night!";
}

$favcolor="red";
switch ($favcolor)
{
    case "red":
    echo "Your favorite color is red!";
    break;
    case "blue":
    echo "Your favorite color is blue!";
    break;
    case "green":
    echo "Your favorite color is green!";
    break;
    default:
    echo "Your favorite color is neither red, blue, or green!";
}

//循環
$i=1;
while($i<=5)
{
    echo "The number is " . $i . "<br>";
    $i++;
}


$i=1;
do
{
    $i++;
    echo "The number is " . $i . "<br>";
}
while ($i<=5);

for ($i=1; $i<=5; $i++)
{
    echo "The number is " . $i . "<br>";
}


$x=array("one","two","three");
foreach ($x as $value)
{
    echo $value . "<br>";
}

?>

4.9:數組

數組長度count();遍歷關聯數組;遍歷數值數組
<?php
$cars=array("Volvo","BMW","Toyota"); //數組定義 數值數組
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . "."; //訪問數組元素

//數組長度count()
$cars=array("Volvo","BMW","Toyota");
echo count($cars); //count() 函數用於返回數組的長度

//遍歷數值數組
$cars=array("Volvo","BMW","Toyota");
$arrlength=count($cars);

for($x=0;$x<$arrlength;$x++)
{
    echo $cars[$x];
    echo "<br>";
}

$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");//定義關聯數組
echo "Peter is " . $age['Peter'] . " years old.";

//遍歷關聯數組
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value)
{
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "<br>";
}
?>

4.9.1:數組排序

PHP - 數組排序函數

  • sort() - 對數組進行升序排列
  • rsort() - 對數組進行降序排列
  • asort() - 根據關聯數組的,對數組進行升序排列
  • ksort() - 根據關聯數組的,對數組進行升序排列
  • arsort() - 根據關聯數組的,對數組進行降序排列
  • krsort() - 根據關聯數組的,對數組進行降序排列
//sort()
$cars=array("Volvo","BMW","Toyota");
sort($cars);

$clength=count($cars);
for($x=0;$x<$clength;$x++)
{
    echo $cars[$x];
    echo "<br>";
}

//rsort()   
$cars=array("Volvo","BMW","Toyota");
rsort($cars);   

//asort() arsort() 關聯數組排序 value
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
asort($age);
arsort($age);

//ksort() krsort() 關聯數組排序 key
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
ksort($age);
krsort($age);
?>

4.10:PHP 函數

PHP 的真正威力源自於它的函數。

在 PHP 中,提供了超過 1000 個內建的函數。

<html>
<body>

<?php
function writeName()
{
    echo "Kai Jim Refsnes";
}

echo "My name is ";
writeName();

//函數傳參
function writeName($fname,$punctuation)
{
    echo $fname . " Refsnes" . $punctuation . "<br>";
}

echo "My name is ";
writeName("Kai Jim",".");
echo "My sister's name is ";

//函數返回值
function add($x,$y)
{
    $total=$x+$y;
    return $total;
}

echo "1 + 16 = " . add(1,16);

?>

</body>
</html>

4.11:魔術變量

有八個魔術常量它們的值隨着它們在代碼中的位置改變而改變。

  • 4.11.1 _LINE__(_line_)
    文件中的當前行號

  • 4.11.2 FILE(file)

  • 文件的完整路徑和文件名。

  • 如果用在被包含文件中,則返回被包含的文件名。

  • 4.11.3 DIR(dir)
    文件所在的目錄。

  • 如果用在被包括文件中,則返回被包括的文件所在的目錄。

  • 4.11.4 FUNCTION(function)函數名稱(PHP 4.3.0 新加)

  • 自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。

<?php
function test() {
    echo  '函數名爲:' . __FUNCTION__ ;
}
test();
?>
  • 4.11.5 CLASS 類的名稱(PHP 4.3.0 新加)

  • 自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。

在 PHP 4 中該值總是小寫字母的。類名包括其被聲明的作用區域(例如 Foo\Bar)。

注意自 PHP 5.4 起 CLASS 對 trait 也起作用。當用在 trait 方法中時,CLASS 是調用 trait 方法的類的名字

<?php
class test {
    function _print() {
        echo '類名爲:'  . __CLASS__ . "<br>";
        echo  '函數名爲:' . __FUNCTION__ ;
    }
}
$t = new test();
$t->_print();
?>
  • 4.11.6 TRAIT( Trait )的名字(PHP 5.4.0 新加)

  • 自 PHP 5.4.0 起,PHP 實現了代碼複用的一個方法稱爲 traits

Trait 名包括其被聲明的作用區域(例如 Foo\Bar)。

從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆蓋。

其行爲 MyHelloWorld 類中定義的方法一致。

優先順序是當前類中的方法會覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法。

<?php
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();
?>

4.11.7 METHOD(method) 類的方法名(PHP 5.0.0 新加)

返回該方法被定義時的名字(區分大小寫)

<?php
function test() {
    echo  '函數名爲:' . __METHOD__ ;
}
test();
?>

4.11.8 NAMESPACE (mamespace)

當前命名空間的名稱(區分大小寫)

此常量是在編譯時定義的(PHP 5.3.0 新增)。

<?php
namespace MyProject;

echo '命名空間爲:"', __NAMESPACE__, '"'; // 輸出 "MyProject"
?>

4.12:命名空間

PHP 命名空間(namespace)是在PHP 5.3中加入的,如果你學過C#和Java,那命名空間就不算什麼新事物。 不過在PHP當中還是有着相當重要的意義。

4.12.1:PHP 命名空間可以解決以下兩類問題:

  • 用戶代碼與PHP內部的類函數/常量之間的名字衝突。
  • 創建別名(或簡短)的名稱,提高源代碼的可讀性。

默認情況下,所有常量、類和函數名都放在全局空間下,就和PHP支持命名空間之前一樣。
如果一個文件中包含命名空間,它必須在其它所有代碼之前聲明命名空間

< ?php  
// 定義代碼在 'MyProject' 命名空間中  
namespace MyProject;  
 
// ... 代碼 ...  

//也可以在同一個文件中定義不同的命名空間代碼
namespace MyProject1;  
// MyProject1 命名空間中的PHP代碼  
 
namespace MyProject2;  
// MyProject2 命名空間中的PHP代碼    
 
// 另一種語法
namespace MyProject3 {  
 // MyProject3 命名空間中的PHP代碼    
}  

?>

聲明命名空間之前唯一合法的代碼是用於定義源文件編碼方式的 declare 語句

所有非 PHP 代碼包括空白符都不能出現在命名空間的聲明之前

<?php
declare(encoding='UTF-8'); //定義多個命名空間和不包含在命名空間中的代碼
namespace MyProject {
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}

namespace { // 全局代碼
    session_start();
    $a = MyProject\connect();
    echo MyProject\Connection::start();
}
?>

以下代碼會出現語法錯誤:

<html>
<?php
namespace MyProject; // 命名空間前出現了“<html>” 會致命錯誤 - 命名空間必須是程序腳本的第一條語句
?>

子命名空間

<?php
namespace MyProject\Sub\Level;  //聲明分層次的單個命名空間
//創建了常量 MyProject\Sub\Level\CONNECT_OK,
//類 MyProject\Sub\Level\Connection 
//和函數 MyProject\Sub\Level\Connect。

const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */  }

?>

4.12.2:命名空間使用
PHP 命名空間中的類名可以通過三種方式引用:

  1. 非限定名稱,或不包含前綴的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當前命名空間是 currentnamespace,foo 將被解析爲 currentnamespace\foo。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,則 foo 會被解析爲foo。                                                                                                                                        警告:如果命名空間中的函數或常量未定義,則該非限定的函數名稱或常量名稱會被解析爲全局函數名稱或常量名稱。   ~~無命名空間前綴的引用,默認在當前命名空間查找,然後到全局命名空間找

  2. 限定名稱,或包含前綴的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果當前的命名空間是 currentnamespace,則 foo 會被解析爲 currentnamespace\subnamespace\foo。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,foo 會被解析爲subnamespace\foo。                                                                         ~~帶相對命名空間前綴的(類似相對路徑)引用,自動在開頭添加調用代碼所處的命名空間

  3. 完全限定名稱,或包含了全局前綴操作符的名稱,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在這種情況下,foo 總是被解析爲代碼中的文字名(literal name)currentnamespace\foo。                                                                                                                                   ~~帶絕對命名空間前綴的引用(類似絕對路徑) 引用路徑已明確 不用查找

file1.php

<?php
namespace Foo\Bar\subnamespace; 

const FOO = 1;
function foo() {}
class foo
{
    static function staticmethod() {}
}
?>

file2.php

<?php
namespace Foo\Bar;
include 'file1.php';

const FOO = 2;
function foo() {}
class foo
{
    static function staticmethod() {}
}

/* 非限定名稱 */
foo(); // 解析爲函數 Foo\Bar\foo
foo::staticmethod(); // 解析爲類 Foo\Bar\foo的靜態方法staticmethod。
echo FOO; // resolves to constant Foo\Bar\FOO

/* 限定名稱 */
subnamespace\foo(); // 解析爲函數 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析爲類 Foo\Bar\subnamespace\foo,
                                  // 以及類的方法 staticmethod
echo subnamespace\FOO; // 解析爲常量 Foo\Bar\subnamespace\FOO
                                  
/* 完全限定名稱 */
\Foo\Bar\foo(); // 解析爲函數 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析爲類 Foo\Bar\foo, 以及類的方法 staticmethod
echo \Foo\Bar\FOO; // 解析爲常量 Foo\Bar\FOO

在命名空間內部訪問全局類、函數和常量

<?php
namespace Foo;

function strlen() {}
const INI_ALL = 3;
class Exception {}

$a = \strlen('hi'); // 調用全局函數strlen
$b = \INI_ALL; // 訪問全局常量 INI_ALL
$c = new \Exception('error'); // 實例化全局類 Exception
?>

4.12.3: 命名空間和動態語言特徵

PHP 命名空間的實現受到其語言自身的動態特徵的影響。因此,如果要將下面的代碼轉換到命名空間中,動態訪問元素。

//example.php

<?php
class classname
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\n";
}
const constname = "global";

$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
?>
<?php
namespace namespacename;
class classname
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\n";
}
const constname = "namespaced";

include 'example1.php';//全局命名空間和某個命名空間有相同類 函數 和 常量 分別區別訪問

$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global

/* note that if using double quotes, "\\namespacename\\classname" must be used */
$a = '\namespacename\classname';
$obj = new $a; // prints namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // also prints namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // prints namespacename\funcname
$b = '\namespacename\funcname';
$b(); // also prints namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // prints namespaced
echo constant('namespacename\constname'), "\n"; // also prints namespaced
?>

namespace關鍵字和__NAMESPACE__常量

<?php
namespace MyProject;

echo '"', __NAMESPACE__, '"'; // 輸出 "MyProject"
?>
<?php

echo '"', __NAMESPACE__, '"'; // 輸出 ""
?>

使用__NAMESPACE__動態創建名稱

<?php
namespace MyProject;

function get($classname)
{
    $a = __NAMESPACE__ . '\\' . $classname;
    return new $a;
}
?>

關鍵字 namespace 可用來顯式訪問當前命名空間或子命名空間中的元素。它等價於類中的 self 操作符

<?php
namespace MyProject;

use blah\blah as mine; // see "Using namespaces: importing/aliasing"

blah\mine(); // calls function blah\blah\mine()
namespace\blah\mine(); // calls function MyProject\blah\mine()

namespace\func(); // calls function MyProject\func()
namespace\sub\func(); // calls function MyProject\sub\func()
namespace\cname::method(); // calls static method "method" of class MyProject\cname
$a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname
$b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b
?>

在PHP中,別名是通過操作符 use 來實現的. 下面是一個使用所有可能的三種導入方式的例子:

使用use操作符導入/使用別名

<?php
namespace foo;
use My\Full\Classname as Another;

// 下面的例子與 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 導入一個全局類
use \ArrayObject;

$obj = new namespace\Another; // 實例化 foo\Another 對象
$obj = new Another; // 實例化 My\Full\Classname 對象
NSname\subns\func(); // 調用函數 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 實例化 ArrayObject 對象
// 如果不使用 "use \ArrayObject" ,則實例化一個 foo\ArrayObject 對象
?>

一行中包含多個use語句

<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 實例化 My\Full\Classname 對象
NSname\subns\func(); // 調用函數 My\Full\NSname\subns\func
?>
<p>導入操作是在編譯執行的,但動態的類名稱、函數名稱或常量名稱則不是。</p>
<ol>
<li>導入和動態名稱</li>
</ol>
<pre>
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 實例化一個 My\Full\Classname 對象
$a = 'Another';
$obj = new $a;      // 實際化一個 Another 對象
?>

導入和動態名稱

<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 實例化一個 My\Full\Classname 對象
$a = 'Another';
$obj = new $a;      // 實際化一個 Another 對象
?>

另外,導入操作隻影響非限定名稱和限定名稱。完全限定名稱由於是確定的,故不受導入的影響。

  1. 導入和完全限定名稱
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // instantiates object of class My\Full\Classname
$obj = new \Another; // instantiates object of class Another
$obj = new Another\thing; // instantiates object of class My\Full\Classname\thing
$obj = new \Another\thing; // instantiates object of class Another\thing
?>

4.12.4 使用命名空間:後備全局函數/常量

在一個命名空間中,當 PHP 遇到一個非限定的類、函數或常量名稱時,它使用不同的優先策略來解析該名稱。

  • 類名稱總是解析到當前命名空間中的名稱(找不到就報錯咯)。因此在訪問系統內部或不包含在命名空間中的類名稱時,必須使用完全限定名稱
  • 函數和常量來說,如果當前命名空間中不存在該函數或常量,PHP 會退而使用全局空間中的函數或常量。
<?php
namespace A\B\C;
class Exception extends \Exception {}

$a = new Exception('hi'); // $a 是類 A\B\C\Exception 的一個對象
$b = new \Exception('hi'); // $b 是類 Exception 的一個對象

$c = new ArrayObject; // 致命錯誤, 找不到 A\B\C\ArrayObject 類
?>

全局空間
如果沒有定義任何命名空間,所有的類與函數的定義都是在全局空間,與 PHP 引入命名空間概念前一樣。在名稱前加上前綴 \ 表示該名稱是全局空間中的名稱,即使該名稱位於其它的命名空間中時也是如此。

<?php
namespace A\B\C;

/* 這個函數是 A\B\C\fopen */
function fopen() { 
     /* ... */
     $f = \fopen(...); // 調用全局的fopen函數
     return $f;
} 
?>

命名空間的順序 略..

4.13 PHP文件處理

打開文件

$file = fopen($fname, mode) //文件的名稱, 打開模式

  • r 只讀。在文件的開頭開始。
  • r+ 讀/寫。在文件的開頭開始。
  • w 只寫。打開並清空文件的內容;如果文件不存在,則創建新文件。
  • w+ 讀/寫。打開並清空文件的內容;如果文件不存在,則創建新文件。
  • a 追加。打開並向文件末尾進行寫操作,如果文件不存在,則創建新文件。
  • a+ 讀/追加。通過向文件末尾寫內容,來保持文件內容。
  • x 只寫。創建新文件。如果文件已存在,則返回 FALSE 和一個錯誤。
  • x+ 讀/寫。創建新文件。如果文件已存在,則返回 FALSE 和一個錯誤。

註釋:如果 fopen() 函數無法打開指定文件,則返回 0 (false)。

<?php
//打開文件
$file = fopen("welcome.txt", "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached

//是否到達文件末尾 
while(!feof($file))
{
    echo fgets($file). "<br>"; //逐行讀取文件
    //echo fgetc($file); //逐字符讀取

}
//關閉文件
fclose($file);
?>

 4.14: 函數

Filesystem 函數

basename() 返回路徑中的文件名部分。
chgrp() 改變文件組。
chmod() 改變文件模式。
chown() 改變文件所有者。
clearstatcache() 清除文件狀態緩存。
copy() 複製文件。
delete() 參見 unlink() 或 unset()
dirname() 返回路徑中的目錄名稱部分。
disk_free_space() 返回目錄的可用空間。
disk_total_space() 返回一個目錄的磁盤總容量。
diskfreespace() disk_free_space() 的別名。
fclose() 關閉打開的文件。
feof() 測試文件指針是否到了文件末尾。
fflush() 向打開的文件刷新緩衝輸出。
fgetc() 從打開的文件中返回字符。
fgetcsv() 從打開的文件中解析一行,校驗 CSV 字段。
fgets() 從打開的文件中返回一行。
fgetss() 從打開的文件中返回一行,並過濾掉 HTML 和 PHP 標籤。
file() 把文件讀入一個數組中。
file_exists() 檢查文件或目錄是否存在。
file_get_contents() 把文件讀入字符串。~~獲取文件內容
file_put_contents() 把字符串寫入文件。~~寫入文件內容
fileatime() 返回文件的上次訪問時間。
filectime() 返回文件的上次修改時間。
filegroup() 返回文件的組 ID。
fileinode() 返回文件的 inode 編號。
filemtime() 返回文件內容的上次修改時間。
fileowner() 返回文件的用戶 ID (所有者)。
fileperms() 返回文件的權限。
filesize() 返回文件大小。
filetype() 返回文件類型。
flock() 鎖定或釋放文件。
fnmatch() 根據指定的模式來匹配文件名或字符串。
fopen() 打開一個文件或 URL。
fpassthru() 從打開的文件中讀數據,直到文件末尾(EOF),並向輸出緩衝寫結果。
fputcsv() 把行格式化爲 CSV 並寫入一個打開的文件中。
fputs() fwrite() 的別名。
fread() 讀取打開的文件。
fscanf() 根據指定的格式對輸入進行解析。
fseek() 在打開的文件中定位。
fstat() 返回關於一個打開的文件的信息。
ftell() 返回在打開文件中的當前位置。
ftruncate() 把打開文件截斷到指定的長度。
fwrite() 寫入打開的文件。
glob() 返回一個包含匹配指定模式的文件名/目錄的數組。
is_dir() 判斷文件是否是一個目錄。
is_executable() 判斷文件是否可執行。
is_file() 判斷文件是否是常規的文件。
is_link() 判斷文件是否是連接。
is_readable() 判斷文件是否可讀。
is_uploaded_file() 判斷文件是否是通過 HTTP POST 上傳的。
is_writable() 判斷文件是否可寫。
is_writeable() is_writable() 的別名。
lchgrp() 改變符號連接的組所有權。
lchown() 改變符號連接的用戶所有權。
link() 創建一個硬連接。
linkinfo() 返回有關一個硬連接的信息。
lstat() 返回關於文件或符號連接的信息。
mkdir() 創建目錄。
move_uploaded_file() 把上傳的文件移動到新位置。
parse_ini_file() 解析一個配置文件。
parse_ini_string() 解析一個配置字符串。
pathinfo() 返回關於文件路徑的信息。
pclose() 關閉由 popen() 打開的進程。
popen() 打開一個進程。
readfile() 讀取一個文件,並寫入到輸出緩衝。
readlink() 返回符號連接的目標。
realpath() 返回絕對路徑名。
realpath_cache_get() 返回高速緩存條目。
realpath_cache_size() 返回高速緩存大小。
rename() 重命名文件或目錄。
rewind() 倒回文件指針的位置。
rmdir() 刪除空的目錄。
set_file_buffer() 設置已打開文件的緩衝大小。
stat() 返回關於文件的信息。
symlink() 創建符號連接。
tempnam() 創建唯一的臨時文件。
tmpfile() 創建唯一的臨時文件。
touch() 設置文件的訪問和修改時間。
umask() 改變文件的文件權限。
unlink() 刪除文件。

4.15:PHP JSON

  • json_encode 對變量進行 JSON 編碼
  • json_decode 對 JSON 格式的字符串進行解碼,轉換爲 PHP 變量
  • json_last_error 返回最後發生的錯誤

string json_encode ( $value [, $options = 0 ] )
參數

value: 要編碼的值。該函數只對 UTF-8 編碼的數據有效。
options:由以下常量組成的二進制掩碼:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT

<?php
   $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
   echo json_encode($arr);


    class Emp {
       public $name = "";
       public $hobbies  = "";
       public $birthdate = "";
   }
   $e = new Emp();
   $e->name = "sachin";
   $e->hobbies  = "sports";
   $e->birthdate = date('m/d/Y h:i:s a', "8/5/1974 12:20:03 p");
   $e->birthdate = date('m/d/Y h:i:s a', strtotime("8/5/1974 12:20:03"));

   echo json_encode($e);
?>

mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])
參數

json_string: 待解碼的 JSON 字符串,必須是 UTF-8 編碼數據

assoc: 當該參數爲 TRUE 時,將返回數組,FALSE 時返回對象。

depth: 整數類型的參數,它指定遞歸深度

options: 二進制掩碼,目前只支持 JSON_BIGINT_AS_STRING 。

<?php
   $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

   var_dump(json_decode($json));
   var_dump(json_decode($json, true));
?>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章