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