摘要:有哪些作用域函數(shù)作用域類作用域函數(shù)作用域是什么函數(shù)體是一個(gè)局部作用域函數(shù)體中無(wú)法直接訪問(wèn)外部全局變量,必須通過(guò)才能訪問(wèn)外部全局變量無(wú)法訪問(wèn)通知錯(cuò)誤正確訪問(wèn)外部全局變量無(wú)法訪問(wèn)函數(shù)體中可以直接訪問(wèn)常量輸出函數(shù)體中可以直接訪問(wèn)類靜態(tài)屬性靜態(tài)方法
PHP 有哪些作用域?
函數(shù)作用域
類作用域
PHP 函數(shù)作用域是什么?函數(shù)體是一個(gè)局部作用域
函數(shù)體中無(wú)法直接訪問(wèn)外部全局變量,必須通過(guò)global/$GLOBALS才能訪問(wèn)外部全局變量
$var = "aa"; function showVar(){ echo $var; //無(wú)法訪問(wèn) } showVar(); //Notice通知錯(cuò)誤 //正確訪問(wèn)外部全局變量 $var = "aa"; function showVar(){ echo $GLOBALS["var"]; //無(wú)法訪問(wèn) } showVar();
函數(shù)體中可以直接訪問(wèn)常量
define("BBO","wutao"); function showVar(){ echo BBO; } showVar();//輸出‘wutao’
函數(shù)體中可以直接訪問(wèn)類(靜態(tài)屬性、靜態(tài)方法)和對(duì)象(屬性、方法)
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();類作用域是什么?有什么注意事項(xiàng)?
類其實(shí)就是一個(gè)完整且獨(dú)立的個(gè)體,外部(變量與函數(shù))可以直接使用它
//定義一個(gè)Person類 class Person{ }; 外部變量直接訪問(wèn)類中靜態(tài)方法/屬性與實(shí)例化 $var = new Person(); $var1 = Person::test(); //函數(shù)內(nèi)部也是直接訪問(wèn)類中靜態(tài)方法/屬性并使用 function demo(){ $var1 = Person::test(); $var = new Person(); }
在類中,方法可以直接調(diào)用外部函數(shù)或其他類,但不可以直接訪問(wèn)外部變量,外部常量(超全局常量)可以任何地方訪問(wèn)
在類中,屬性可以直接訪問(wèn)外部常量(超全局常量),但外部函數(shù)、外部變量,其他類就無(wú)法訪問(wèn)
$var = "121"; function fn(){} class Student{} define("CONF","121"); class Person{ public $one = new Student(); //不正確,無(wú)法訪問(wèn) public $two = fn(); //不正確,無(wú)法訪問(wèn) public $three = $var; //不正確,無(wú)法訪問(wèn) public $four = CONF; //正確,可以訪問(wèn) }PHP 常量有哪些?各自有什么特點(diǎn)?常量取值類型有哪幾種?
超全局常量(系統(tǒng)內(nèi)置超全局變量/常量用法一樣)
//定義超全局常量,無(wú)論在函數(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 四種類型之一,不能是其他類型
外部全局變量 $var = "string"; 除4種基本類型,還可以數(shù)組/對(duì)象/null數(shù)據(jù)類型;
外部全局變量的特點(diǎn):函數(shù)中要用過(guò)global/$GLOBALS才能訪問(wèn)到外部全局變量(一般不推薦這樣使用),類中(方法和屬性)都無(wú)法直接訪問(wèn)外部全局變量
靜態(tài)變量 在函數(shù)中定義的一種變量; static $a = 0;
靜態(tài)變量的特點(diǎn):在一次請(qǐng)求響應(yīng)中,無(wú)論函數(shù)調(diào)用多少次,靜態(tài)變量的初始化只會(huì)執(zhí)行一次
局部變量 在函數(shù)中定義的一種變量; $a = 0;
局部變量的特點(diǎn):只在定義的函數(shù)中有效,函數(shù)執(zhí)行完,局部變量就會(huì)釋放,所以外部無(wú)法訪問(wèn)局部變量
由于PHP是手工編譯最簡(jiǎn)化安裝,所以只包含一些基本擴(kuò)展,其他大部分?jǐn)U展都沒(méi)有,后期才按需添加
加入其他擴(kuò)展,有2種方法
1、重新安裝PHP (不推薦)
2、使用PHP官方提供的工具phpize來(lái)添加 (添加)
使用phpize來(lái)生成其他擴(kuò)展.so文件
phpize工具所在位置:php安裝目錄/bin/phpize
所需依賴:autoconf工具 yum install autoconf
步驟: 1、cd /php源碼目錄/ext 2、找到所需安裝擴(kuò)展庫(kù),然后cd進(jìn)入 //例如: 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ù)定義時(shí),前面加&代表什么?加與不加&有什么區(qū)別?
前置知識(shí)
$a = 55; $b = &$a; //引用變量 $b為55 $b = 100; //$b為100 $a為100
函數(shù)的返回方式有2種
1、引用返回方式(定義函數(shù)時(shí),前面需加&,否則函數(shù)調(diào)用時(shí)只會(huì)普通返回)
2、普通返回方式(在調(diào)用函數(shù)前不能使用&符號(hào),否則會(huì)報(bào)錯(cuò))
注意事項(xiàng)
1、如果定義函數(shù)時(shí),前面加&的話,函數(shù)調(diào)用可以使用引用返回和普通返回URL 如何變得更加優(yōu)美?
2、如果定義函數(shù)時(shí),前面不加&的話,函數(shù)調(diào)用可以只可使用普通返回
原始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"] 獲取
進(jìn)一步優(yōu)化 ———— 隱藏入口文件index.php
http://www.test.com/key/val
要使用到服務(wù)器Apache/Nginx的URL重寫(xiě)功能
最終優(yōu)化 ———— 開(kāi)發(fā)路由層(偽靜態(tài))
http://www.test.com/val.html
很多框架都有路由層,此路由優(yōu)化后的 URL ,對(duì) SEO 最為友好如何使用 Xdebug 來(lái)調(diào)試 PHP 代碼
在 php.ini 進(jìn)入如下配置
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 ;這里是開(kāi)啟遠(yuǎn)程調(diào)試 xdebug.remote_handler = "dbgp" ;遠(yuǎn)程調(diào)試的host xdebug.remote_host = "127.0.0.1" ;遠(yuǎn)程調(diào)試的端口號(hào) xdebug.remote_port = 9000 ;遠(yuǎn)程調(diào)試的對(duì)應(yīng) key xdebug.idekey="PHPSTORM"
瀏覽器要安裝對(duì)應(yīng)的調(diào)試插件
chrome => xdebug helper
火狐 => Xdebug Helper
遠(yuǎn)程調(diào)試
1、要檢查防火墻是否已經(jīng)關(guān)閉面向?qū)ο笾?static與self的區(qū)別
2、如果你的項(xiàng)目所在環(huán)境是外網(wǎng),就是IDE所在PC與項(xiàng)目部署環(huán)境不能通過(guò)IP直接訪問(wèn),則遠(yuǎn)程斷點(diǎn)方式不能使用。(必須使用域名)
self非動(dòng)態(tài)的,在哪個(gè)類中存在,self就代表哪個(gè)類
static是動(dòng)態(tài)的,根據(jù)具體哪個(gè)類調(diào)用,static指向那個(gè)類
static與self的區(qū)別
PHP 自動(dòng)加載機(jī)制是什么?在做項(xiàng)目時(shí),我們經(jīng)常遇到要用到很多類(有些是自己寫(xiě)的,有些是第三方類庫(kù)的), 使用前必須先加載(include/require),但如果全部自己手動(dòng)加載,那么將很吃力不討好: 1、代碼量巨大,不好維護(hù),浪費(fèi)時(shí)間 2、無(wú)法做到按需加載,運(yùn)行性能低下 3、還有可能造成重復(fù)加載統(tǒng)一類 所以,PHP5提出解決這一問(wèn)題方法:自動(dòng)加載機(jī)制
第一代自動(dòng)加載機(jī)制 autoload
function __autoload($classname) { require_once ($classname . “class.php”); } $person = new Person(”Altair”, 6); var_dump ($person);
看出autoload至少要做三件事情,
第一件事是根據(jù)類名確定類文件名
第二件事是確定類文件所在的磁盤(pán)路徑(在我們的例子是最簡(jiǎn)單的情況,類與調(diào)用它們的PHP程序文件在同一個(gè)文件夾下)
第三件事是將類從磁盤(pán)文件中加載到系統(tǒng)中(第三步最簡(jiǎn)單,只需要使用include/require即可)
缺點(diǎn)就是:一般項(xiàng)目都是用到第三方類庫(kù),很多時(shí)候這種類名與與類文件所在的磁盤(pán)路徑的映射規(guī)則與我們訂的不同,如果全部寫(xiě)在一個(gè)__autoload()函數(shù)里會(huì)很臃腫,難維護(hù),性能低等問(wèn)題
第二代自動(dòng)加載機(jī)制 SPL autoload
PHP5提供的一個(gè)SPL擴(kuò)展,其中提供的自動(dòng)加載機(jī)制用于取代上面第一代自動(dòng)加載機(jī)制spl_autoload是SPL實(shí)現(xiàn)的默認(rèn)的自動(dòng)加載函數(shù),它的功能比較簡(jiǎn)單。我們不能擴(kuò)展spl_autoload()函數(shù),
怎樣讓spl_autoload自動(dòng)起作用呢?在PHP腳本中第一次調(diào)用spl_autoload_register()函數(shù),無(wú)需傳入任何參數(shù),一般不會(huì)使用SPL擴(kuò)展預(yù)先定義好的spl_autoload()函數(shù)
## 1、注冊(cè)函數(shù) function my_autoloader($class) { include "classes/" . $class . ".class.php"; } spl_autoload_register("my_autoloader"); ## 2、自PHP 5.3.0起可以使用一個(gè)匿名函數(shù) spl_autoload_register(function ($class) { include "classes/" . $class . ".class.php"; }); ## 3、注冊(cè)類靜態(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)用,注冊(cè)類靜態(tài)方法 namespace Foobar; class Framework{ public static function init() { require_once (__DIR__ . "/functions.php"); // 自動(dòng)加載設(shè)置 spl_autoload_register("self::loadClass"); } public static function loadClass($className) { $className = str_replace("", DIRECTORY_SEPARATOR, $className); } }
如果 加載的類 是在某命名空間內(nèi)的話,自動(dòng)加載函數(shù)接受到的$class變量將是 thinklibPerson
必須帶上命名空間
注意
如果同時(shí)定義__autoload()函數(shù)和spl_autoload_register()函數(shù),那到底會(huì)怎樣?
先spl_autoload_register()起效果,如果沒(méi)有這個(gè)函數(shù)的話,那么再找__autoload()函數(shù)
同時(shí)注冊(cè)多個(gè)autoload函數(shù),該如何執(zhí)行呢?
按順序執(zhí)行多個(gè)注冊(cè)的autoload()函數(shù),但只要執(zhí)行了require/include之后,后面注冊(cè)的函數(shù)就不會(huì)執(zhí)行下去了 autoload()函數(shù)內(nèi)返回return true/false都沒(méi)有效果
PHP 自動(dòng)加載機(jī)制
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");
對(duì)象方法
class A { function test($req, $resp) { echo "hello world"; } } $object = new A(); $server->on("Request", array($object, "test"));
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/23283.html
小編寫(xiě)這篇文章的主要目的,主要是給大家介紹關(guān)于python3 queue多線程通信,這里面有很多的技術(shù)性的難點(diǎn),那么,該怎么去進(jìn)行處理呢,下面小編給大家進(jìn)行詳細(xì)的解答一下。 queue分類 python3 queue分三類: 先進(jìn)先出隊(duì)列 后進(jìn)先出的棧 優(yōu)先級(jí)隊(duì)列 他們的導(dǎo)入方式分別是: fromqueueimportQueue fromqueueimportLifoQueue...
什么是樹(shù) 現(xiàn)實(shí)中樹(shù)隨處可見(jiàn);在計(jì)算機(jī)世界,樹(shù)就是一種分層結(jié)構(gòu)的抽象模型。 如下圖所示: 樹(shù)結(jié)構(gòu)的可以用在很多情景,就如下圖公司的組織架構(gòu),用樹(shù)就可以表達(dá)出來(lái),如下圖: 組織架構(gòu)只是其中之一,比如族譜、省市等用樹(shù)的結(jié)構(gòu)形式展現(xiàn)是完全可以。 樹(shù)的術(shù)語(yǔ) 樹(shù)有很多的術(shù)語(yǔ),如下圖: 樹(shù):n(n≥0)個(gè)節(jié)點(diǎn)所構(gòu)成的有限集合,當(dāng)n=0時(shí),稱為空樹(shù); 節(jié)點(diǎn)的度:節(jié)點(diǎn)的子樹(shù)個(gè)數(shù),例如B節(jié)點(diǎn)的度就...
摘要:是什么基于內(nèi)存有客戶端和服務(wù)器端非關(guān)系型數(shù)據(jù)庫(kù)應(yīng)用場(chǎng)景是什么緩存隊(duì)列數(shù)據(jù)持久存儲(chǔ)如何安裝如何啟動(dòng)如何關(guān)閉客戶端如何啟動(dòng)下載解壓編譯安裝服務(wù)啟動(dòng)注意這種方式啟動(dòng)使用的是默認(rèn)配置通過(guò)啟動(dòng)參數(shù)告訴使用指定配置文件使用下面命令啟動(dòng)服務(wù)關(guān) redis 是什么? 基于內(nèi)存 有客戶端和服務(wù)器端 NoSQL非關(guān)系型數(shù)據(jù)庫(kù) redis 應(yīng)用場(chǎng)景是什么? 緩存 隊(duì)列 數(shù)據(jù)持久存儲(chǔ) redis 如何...
小編寫(xiě)這篇文章的一個(gè)主要目的,主要是來(lái)給大家做個(gè)介紹,介紹的內(nèi)容主要是涉及到Python一些試題的講解,小編給大家總結(jié)出來(lái)了五道必考的題目,大家可要仔細(xì)閱讀哦,下面就給大家詳細(xì)解答。 1、使用while循環(huán)實(shí)現(xiàn)輸出2-3+4-5+6...+100的和 #方法一 #從2開(kāi)始計(jì)算 i=2 #定義一個(gè)變量用于保存結(jié)果 sum=0 whilei<=100: i...
摘要:進(jìn)程的工作就是管理子進(jìn)程,而子進(jìn)程的工作就是處理用戶請(qǐng)求。當(dāng)新的請(qǐng)求過(guò)來(lái)的時(shí)候,管理線程會(huì)把請(qǐng)求交給其他的空閑線程處理。 當(dāng)前主流的web服務(wù)器有哪些? Apache Nginx iis Apache的工作模式有哪些?各自的特點(diǎn)和優(yōu)缺點(diǎn)是什么?適用場(chǎng)景是什么? apache主要工作模式有3種,分別如下: prefork工作模式 特點(diǎn) prefork模式是一種非線程的多進(jìn)程模型,we...
閱讀 2588·2019-08-30 10:53
閱讀 3191·2019-08-29 16:20
閱讀 2947·2019-08-29 15:35
閱讀 1769·2019-08-29 12:24
閱讀 2877·2019-08-28 18:19
閱讀 1851·2019-08-23 18:07
閱讀 2331·2019-08-23 15:31
閱讀 1168·2019-08-23 14:05