成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP Q&A

mikasa / 587人閱讀

摘要:有哪些作用域函數(shù)作用域類作用域函數(shù)作用域是什么函數(shù)體是一個局部作用域函數(shù)體中無法直接訪問外部全局變量,必須通過才能訪問外部全局變量無法訪問通知錯誤正確訪問外部全局變量無法訪問函數(shù)體中可以直接訪問常量輸出函數(shù)體中可以直接訪問類靜態(tài)屬性靜態(tài)方法

PHP 有哪些作用域?

函數(shù)作用域

類作用域

PHP 函數(shù)作用域是什么?

函數(shù)體是一個局部作用域

函數(shù)體中無法直接訪問外部全局變量,必須通過global/$GLOBALS才能訪問外部全局變量

$var = "aa";
function showVar(){
    echo $var; //無法訪問
}
showVar(); //Notice通知錯誤

//正確訪問外部全局變量
$var = "aa";
function showVar(){
    echo $GLOBALS["var"]; //無法訪問
}
showVar();

函數(shù)體中可以直接訪問常量

define("BBO","wutao");
function showVar(){
    echo BBO;
}
showVar();//輸出‘wutao’

函數(shù)體中可以直接訪問(靜態(tài)屬性、靜態(tài)方法)和對象(屬性、方法)

function showVar(){
    $person = new Person();
    $person->getName();
    Person::getAge();
}

class Person{
    private $name = "不懂撒的";
    public static $age = 200;
        
    public function getName(){
        echo $this->name;
    }
        
    public static function getAge(){
        echo self::$age;
    }
}
    
showVar();
類作用域是什么?有什么注意事項?

類其實就是一個完整且獨立的個體,外部(變量與函數(shù))可以直接使用它

//定義一個Person類
class Person{

};
外部變量直接訪問類中靜態(tài)方法/屬性與實例化
$var = new Person();
$var1 = Person::test();
//函數(shù)內(nèi)部也是直接訪問類中靜態(tài)方法/屬性并使用
function demo(){
    $var1 = Person::test();
    $var = new Person();
}

在類中,方法可以直接調(diào)用外部函數(shù)或其他類,但不可以直接訪問外部變量,外部常量(超全局常量)可以任何地方訪問

在類中,屬性可以直接訪問外部常量(超全局常量),但外部函數(shù)、外部變量,其他類就無法訪問

$var = "121";
function fn(){}
class Student{}
define("CONF","121");

class Person{
    public $one = new Student(); //不正確,無法訪問
    public $two = fn(); //不正確,無法訪問
    public $three = $var; //不正確,無法訪問
    public $four = CONF; //正確,可以訪問
}
PHP 常量有哪些?各自有什么特點?常量取值類型有哪幾種?

超全局常量系統(tǒng)內(nèi)置超全局變量/常量用法一樣

//定義超全局常量,無論在函數(shù),方法,還是外部定義,只要定義,此常量都是超全局常量,哪都可以直接使用
define("BOSS","wt"); 

function showVar(){    
    echo BOSS;
    $person = new Person();
    $person->getName();
    Person::getAge();
}

class Person{
    private $name = BOSS;   //wt
    public static $age = BOSS;   //wt
        
    public function getName(){
        echo BOSS;   //wt
        echo $this->name;  //wt
    }
        
    public static function getAge(){
        echo self::$age;  //wt
        echo BOSS;        //wt
    }
}
    
showVar();

類中常量

function showVar(){
    $person = new Person();
    $person->getName();
    Person::getAge();
    echo Person::BMM;   //外部調(diào)用類常量
}

class Person{
    const BMM = "xiaomi";
    private $name = self::BMM;  //輸出xiaomi
    public static $age = self::BMM;  //輸出xiaomi
        
    public function getName(){
        echo $this->name;  //輸出xiaomi
    }
        
    public static function getAge(){
        echo self::BMM;  //內(nèi)部調(diào)用類常量
        echo self::$age;  //輸出xiaomi
    }
}
    
showVar();

常量類型
boolean/integer/float/string 四種類型之一,不能是其他類型

PHP 變量種類有哪些?各自有什么特點

外部全局變量 $var = "string"; 除4種基本類型,還可以數(shù)組/對象/null數(shù)據(jù)類型;
外部全局變量的特點:函數(shù)中要用過global/$GLOBALS才能訪問到外部全局變量(一般不推薦這樣使用),類中(方法和屬性)都無法直接訪問外部全局變量

靜態(tài)變量 在函數(shù)中定義的一種變量; static $a = 0;
靜態(tài)變量的特點:在一次請求響應(yīng)中,無論函數(shù)調(diào)用多少次,靜態(tài)變量的初始化只會執(zhí)行一次

局部變量 在函數(shù)中定義的一種變量; $a = 0;
局部變量的特點:只在定義的函數(shù)中有效,函數(shù)執(zhí)行完,局部變量就會釋放,所以外部無法訪問局部變量

純凈手工編譯版PHP如何增加其他擴展類庫?

由于PHP是手工編譯最簡化安裝,所以只包含一些基本擴展,其他大部分?jǐn)U展都沒有,后期才按需添加

加入其他擴展,有2種方法

1、重新安裝PHP (不推薦)
2、使用PHP官方提供的工具phpize來添加 (添加)

使用phpize來生成其他擴展.so文件

phpize工具所在位置:php安裝目錄/bin/phpize
所需依賴:autoconf工具 yum install autoconf
步驟:
1、cd /php源碼目錄/ext
2、找到所需安裝擴展庫,然后cd進入  //例如: cd curl
3、php安裝目錄/bin/phpize   //生成configure文件
4、./configure --with-php-config=/usr/local/php/bin/php-config  //生成Makefile
5、make && make install

## 最終.so安裝位置在php/bin/php-config中已經(jīng)指定

php.ini配置文件中加入extension=curl.so

注意:如果想按上面配置,必須在php.ini中配置extension_dir="/usr/local/php/ext"
PHP 如何使用函數(shù)更健壯呢?
function_exists("ini_set") && ini_set("memory_limit", "1024M");
PHP 如何定義常量更健壯呢?
defined("GREETING") || define("GREETING","Hello world!");
函數(shù)定義時,前面加&代表什么?加與不加&有什么區(qū)別?

前置知識

$a = 55;
$b = &$a; //引用變量 $b為55
$b = 100; //$b為100 $a為100

函數(shù)的返回方式有2種

1、引用返回方式(定義函數(shù)時,前面需加&,否則函數(shù)調(diào)用時只會普通返回
2、普通返回方式(在調(diào)用函數(shù)前不能使用&符號,否則會報錯)

注意事項

1、如果定義函數(shù)時,前面加&的話,函數(shù)調(diào)用可以使用引用返回普通返回
2、如果定義函數(shù)時,前面不加&的話,函數(shù)調(diào)用可以只可使用普通返回
URL 如何變得更加優(yōu)美?

原始URL ———— 查詢字符串

http://www.test.com/index.php?key=val
參數(shù)可以使用 $_GET["key"] 獲取,但這樣的 URL 很不美觀

初步優(yōu)化 ———— 使用PATHINFO模式

http://www.test.com/index.php/key/val
使用 PATHINFO 模式的 URL ,參數(shù)的獲取就不可以使用 $_GET["key"] 獲取了。

必須使用 $_SERVER["PATH_INFO"] 獲取

進一步優(yōu)化 ———— 隱藏入口文件index.php

http://www.test.com/key/val
要使用到服務(wù)器Apache/Nginx的URL重寫功能

最終優(yōu)化 ———— 開發(fā)路由層(偽靜態(tài))

http://www.test.com/val.html
很多框架都有路由層,此路由優(yōu)化后的 URL ,對 SEO 最為友好
如何使用 Xdebug 來調(diào)試 PHP 代碼

在 php.ini 進入如下配置

xdebug.profiler_output_dir="H:installphpStudy	mpxdebug"
xdebug.trace_output_dir="H:installphpStudy	mpxdebug"
zend_extension="H:installphpStudyphpphp-5.6.27-ntsextphp_xdebug.dll"

xdebug.profiler_enable = 1
xdebug.auto_trace = 1
xdebug.show_exception_trace = 1
;這里必須設(shè)置為0,為了能使用瀏覽器插件 xdebug helper配合調(diào)試
xdebug.remote_autostart = 0
xdebug.remote_enable = 1
;這里是開啟遠程調(diào)試
xdebug.remote_handler = "dbgp"
;遠程調(diào)試的host
xdebug.remote_host = "127.0.0.1"
;遠程調(diào)試的端口號
xdebug.remote_port = 9000
;遠程調(diào)試的對應(yīng) key
xdebug.idekey="PHPSTORM" 

瀏覽器要安裝對應(yīng)的調(diào)試插件

chrome => xdebug helper
火狐 => Xdebug Helper

遠程調(diào)試

1、要檢查防火墻是否已經(jīng)關(guān)閉
2、如果你的項目所在環(huán)境是外網(wǎng),就是IDE所在PC與項目部署環(huán)境不能通過IP直接訪問,則遠程斷點方式不能使用。(必須使用域名)
面向?qū)ο笾?static與self的區(qū)別

self非動態(tài)的,在哪個類中存在,self就代表哪個類

static是動態(tài)的,根據(jù)具體哪個類調(diào)用,static指向那個類

static與self的區(qū)別

PHP 自動加載機制是什么?
在做項目時,我們經(jīng)常遇到要用到很多類(有些是自己寫的,有些是第三方類庫的),
使用前必須先加載(include/require),但如果全部自己手動加載,那么將很吃力不討好:

1、代碼量巨大,不好維護,浪費時間
2、無法做到按需加載,運行性能低下
3、還有可能造成重復(fù)加載統(tǒng)一類

所以,PHP5提出解決這一問題方法:自動加載機制

第一代自動加載機制 autoload

function __autoload($classname) {
    require_once ($classname . “class.php”);
}

$person = new Person(”Altair”, 6);
var_dump ($person);
看出autoload至少要做三件事情,
第一件事是根據(jù)類名確定類文件名
第二件事是確定類文件所在的磁盤路徑(在我們的例子是最簡單的情況,類與調(diào)用它們的PHP程序文件在同一個文件夾下)
第三件事是將類從磁盤文件中加載到系統(tǒng)中(第三步最簡單,只需要使用include/require即可)
缺點就是:一般項目都是用到第三方類庫,很多時候這種類名與與類文件所在的磁盤路徑的映射規(guī)則與我們訂的不同,如果全部寫在一個__autoload()函數(shù)里會很臃腫,難維護,性能低等問題

第二代自動加載機制 SPL autoload

PHP5提供的一個SPL擴展,其中提供的自動加載機制用于取代上面第一代自動加載機制

spl_autoload是SPL實現(xiàn)的默認(rèn)的自動加載函數(shù),它的功能比較簡單。我們不能擴展spl_autoload()函數(shù),
怎樣讓spl_autoload自動起作用呢?在PHP腳本中第一次調(diào)用spl_autoload_register()函數(shù),無需傳入任何參數(shù),一般不會使用SPL擴展預(yù)先定義好的spl_autoload()函數(shù)

## 1、注冊函數(shù)
function my_autoloader($class) {
    include "classes/" . $class . ".class.php";
}
spl_autoload_register("my_autoloader");

## 2、自PHP 5.3.0起可以使用一個匿名函數(shù)
spl_autoload_register(function ($class) {
    include "classes/" . $class . ".class.php";
});

## 3、注冊類靜態(tài)方法 -- 自 PHP 5.3.0 起
namespace Foobar;
class Foo {
    static public function test($className) {
        $className = str_replace("", DIRECTORY_SEPARATOR, $className);
    }
}
spl_autoload_register(__NAMESPACE__ ."Foo::test");

## 4、在類方法中調(diào)用,注冊類靜態(tài)方法
namespace Foobar;
class Framework{
    public static function init() {
         require_once (__DIR__ . "/functions.php");
         // 自動加載設(shè)置
         spl_autoload_register("self::loadClass");
    }
    
    public static function loadClass($className) {
        $className = str_replace("", DIRECTORY_SEPARATOR, $className);
    }
}
如果 加載的類 是在某命名空間內(nèi)的話,自動加載函數(shù)接受到的$class變量將是 thinklibPerson
必須帶上命名空間

注意

如果同時定義__autoload()函數(shù)和spl_autoload_register()函數(shù),那到底會怎樣?
先spl_autoload_register()起效果,如果沒有這個函數(shù)的話,那么再找__autoload()函數(shù)
同時注冊多個autoload函數(shù),該如何執(zhí)行呢?
按順序執(zhí)行多個注冊的autoload()函數(shù),但只要執(zhí)行了require/include之后,后面注冊的函數(shù)就不會執(zhí)行下去了

autoload()函數(shù)內(nèi)返回return true/false都沒有效果

PHP 自動加載機制

4種PHP回調(diào)函數(shù)風(fēng)格是什么?
匿名函數(shù)回調(diào)
$server->on("Request", function ($req, $resp) {
    echo "hello world";
});
類靜態(tài)方法回調(diào)
class A
{
    static function test($req, $resp)
    {
        echo "hello world";
    }
}
$server->on("Request", "A::Test");
$server->on("Request", array("A", "Test"));
函數(shù)回調(diào)
function my_onRequest($req, $resp)
{
    echo "hello world";
}
$server->on("Request", "my_onRequest");
對象方法
class A
{
    function test($req, $resp)
    {
        echo "hello world";
    }
}

$object = new A();
$server->on("Request", array($object, "test"));

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/23283.html

相關(guān)文章

  • python3 queue多線程通信

      小編寫這篇文章的主要目的,主要是給大家介紹關(guān)于python3 queue多線程通信,這里面有很多的技術(shù)性的難點,那么,該怎么去進行處理呢,下面小編給大家進行詳細(xì)的解答一下?! ueue分類  python3 queue分三類:  先進先出隊列  后進先出的?! ?yōu)先級隊列  他們的導(dǎo)入方式分別是: fromqueueimportQueue   fromqueueimportLifoQueue...

    89542767 評論0 收藏0
  • JavaScript樹結(jié)構(gòu)深度優(yōu)先算法

      什么是樹  現(xiàn)實中樹隨處可見;在計算機世界,樹就是一種分層結(jié)構(gòu)的抽象模型?! ∪缦聢D所示:  樹結(jié)構(gòu)的可以用在很多情景,就如下圖公司的組織架構(gòu),用樹就可以表達出來,如下圖:  組織架構(gòu)只是其中之一,比如族譜、省市等用樹的結(jié)構(gòu)形式展現(xiàn)是完全可以。  樹的術(shù)語  樹有很多的術(shù)語,如下圖:  樹:n(n≥0)個節(jié)點所構(gòu)成的有限集合,當(dāng)n=0時,稱為空樹;  節(jié)點的度:節(jié)點的子樹個數(shù),例如B節(jié)點的度就...

    3403771864 評論0 收藏0
  • redis Q&A

    摘要:是什么基于內(nèi)存有客戶端和服務(wù)器端非關(guān)系型數(shù)據(jù)庫應(yīng)用場景是什么緩存隊列數(shù)據(jù)持久存儲如何安裝如何啟動如何關(guān)閉客戶端如何啟動下載解壓編譯安裝服務(wù)啟動注意這種方式啟動使用的是默認(rèn)配置通過啟動參數(shù)告訴使用指定配置文件使用下面命令啟動服務(wù)關(guān) redis 是什么? 基于內(nèi)存 有客戶端和服務(wù)器端 NoSQL非關(guān)系型數(shù)據(jù)庫 redis 應(yīng)用場景是什么? 緩存 隊列 數(shù)據(jù)持久存儲 redis 如何...

    saucxs 評論0 收藏0
  • Python必考五大面試題是什么?下文給大家解答

      小編寫這篇文章的一個主要目的,主要是來給大家做個介紹,介紹的內(nèi)容主要是涉及到Python一些試題的講解,小編給大家總結(jié)出來了五道必考的題目,大家可要仔細(xì)閱讀哦,下面就給大家詳細(xì)解答。  1、使用while循環(huán)實現(xiàn)輸出2-3+4-5+6...+100的和  #方法一   #從2開始計算   i=2   #定義一個變量用于保存結(jié)果   sum=0   whilei<=100:   i...

    89542767 評論0 收藏0
  • WebServer Q&A

    摘要:進程的工作就是管理子進程,而子進程的工作就是處理用戶請求。當(dāng)新的請求過來的時候,管理線程會把請求交給其他的空閑線程處理。 當(dāng)前主流的web服務(wù)器有哪些? Apache Nginx iis Apache的工作模式有哪些?各自的特點和優(yōu)缺點是什么?適用場景是什么? apache主要工作模式有3種,分別如下: prefork工作模式 特點 prefork模式是一種非線程的多進程模型,we...

    MkkHou 評論0 收藏0

發(fā)表評論

0條評論

mikasa

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<