PHP有哪些作用域?函数作用域类作用域什么是PHP函数作用域?函数体是局部作用域。在函数体中,不能直接访问外部全局变量。必须通过global/$GLOBALS$var='aa';functionshowVar(){echo$var;访问外部全局变量//无法访问}showVar();//Notice通知错误//正确访问外部全局变量$var='aa';functionshowVar(){echo$GLOBALS['var'];//无法访问}showVar();函数体可以直接访问常量define('BBO','wutao');functionshowVar(){echoBBO;}showVar();//输出'wutao'函数体可以直接访问类(静态属性,静态方法)和对象(属性,方法)functionshowVar(){$person=newPerson();$person->getName();Person::getAge();}classPerson{private$name='不明白';公共静态$age=200;公共函数getName(){echo$this->name;}publicstaticfunctiongetAge(){echoself::$age;}}showVar();什么是类范围?有什么注意事项?一个类其实就是一个完整的独立个体,外部(变量和函数)可以直接使用它//定义一个Person类classPerson{};外部变量直接访问类中的静态方法/属性并实例化$var=newPerson();$var1=Person::test();//内部函数也直接访问类中的静态方法/属性并使用function演示(){$var1=Person::test();$var=新人();}在一个类中,方法可以直接调用外部函数或其他类,但不能直接访问外部变量,类中任何地方都可以访问外部常量(超全局常量),属性可以直接访问外部常量(超全局常量),但是外部函数,外部变量,其他类不能访问$var='121';functionfn(){}classStudent{}define('CONF','121');classPerson{public$one=newStudent();//不正确,不能访问public$two=fn();//不正确,不能访问public$three=$var;//不正确,不能访问public$four=CONF;//正确,可以访问}PHP常量是什么?各有什么特点?常量值有哪些类型?超全局常量(系统内置超全局变量/常量用法同上)//定义一个超全局常量,无论是在函数、方法还是外部定义中,只要定义了这个常量就是超全局常量,即可以直接使用define('BOSS','wt');功能showVar(){回声老板;$人=新人();$person->getName();Person::getAge();}classPerson{private$name=BOSS;//wtpublicstatic$age=BOSS;//wtpublicfunctiongetName(){echoBOSS;//wtecho$this->name;//wt}publicstaticfunctiongetAge(){echoself::$age;//wtechoBOSS;//wt}}showVar();类常量函数showVar(){$person=newPerson();$person->getName();人::getAge();回声人::BM男;//外部调用类常量}classPerson{constBMM='xiaomi';私人$name=self::BMM;//输出xiaomipublicstatic$age=self::BMM;//输出xiaomipublicfunctiongetName(){echo$this->name;//输出小米}publicstaticfunctiongetAge(){echoself::BMM;//内部调用类常量echoself::$age;//输出小米}}showVar();常量类型boolean/integer/float/string四种类型之一,不是其他类型PHP变量有哪些类型?每个外部全局变量的特点是什么$var='string';除了4种基本类型外,还可以使用array/object/null数据类型;外部全局变量的特点:必须在函数中使用global/$GLOBALS来访问外部全局变量(一般不推荐),类(方法和属性)不能直接访问外部全局变量staticvariables定义在函数中的变量;静态$a=0;静态变量的特点:在一个请求响应中,无论函数被调用多少次,静态变量的初始化只会执行一次。它将被释放,因此外部无法访问局部变量。PHP纯手编译版如何添加其他扩展类库?由于PHP是手动编译的,简化了安装,所以只包含了一些基本的扩展,其他大部分扩展是没有的。稍后,根据需要添加其他扩展。有两种方法:1.重新安装PHP(不推荐)2.使用PHP官方提供的工具phpize添加(添加)使用phpize生成其他扩展.so文件phpize工具位置:php安装目录/bin/phpize所需依赖:autoconf工具yuminstallautoconf步骤:1.cd/php源代码目录/ext2,找到需要安装的扩展库,然后cd进去//例如:cdcurl3,php安装目录/bin/phpize//生成配置文件4,./configure--with-php-config=/usr/local/php/bin/php-config//生成Makefile5,make&&makeinstall##最终的.so安装位置已经在php/bin/php-config中指定了在php.ini配置文件中添加extension=curl.so注意:如果要像上面那样配置,必须配置extension_dirinphp.ini="/usr/local/php/ext"PHP如何更健壮地使用函数?function_exists('ini_set')&&ini_set('memory_limit','1024M');PHP如何更稳健地定义常量?定义(“问候语”)||define("问候语","你好世界!");定义函数时,前面加&是什么意思?加&不加&有什么区别?预知$a=55;$b=&$a;//引用变量$b为55$b=100;//$bis100$ais100函数有两种返回方式1.引用返回方式(定义函数时,前面必须加&,否则调用时函数只会正常返回)2。普通返回方式(调用函数前不能使用&符号,否则会报错)注意事项1.如果定义了一个函数前面加上&,函数调用可以使用引用return和普通return2.如果函数定义前不加&,函数调用只能使用普通returnURL如何变得更漂亮?原始URL————查询字符串http://www.test.com/index.php?key=val参数可以使用$_GET['key']获取,但是这样的URL非常难看初步优化———使用PATHINFO方式的URLhttp://www.test.com/index.php/key/val使用PATHINFO方式的URL,使用$_GET['key']获取不到参数必须使用$_SERVER['PATH_INFO']才能获得进一步的优化——隐藏入口文件index.phphttp://www.test.com/key/val使用服务器端的URL重写功能Apache/Nginx最终优化————开发路由层(伪静态)http://www.test.com/val.html很多框架都有路由层,这个路由优化后的URL对SEO最友好如何使用Xdebug调试PHP代码在php中ini中输入如下配置-5.6.27-nts\ext\php_xdebug.dll"xdebug.profiler_enable=1xdebug.auto_trace=1xdebug.show_exception_trace=1;这里必须设置为0,才能使用浏览器插件xdebughelper配合调试xdebug.remote_autostart=0xdebug.remote_enable=1;这里是开启远程调试xdebug.remote_handler="dbgp";远程调试hostxdebug.remote_host="127.0.0.1";远程调试端口号xdebug.remote_port=9000;远程调试对应的keyxdebug.idekey="PHPSTORM"浏览器需要安装相应的调试插件chrome=>xdebughelperFirefox=>XdebugHelper远程调试1.检查防火墙是否关闭2.如果你的项目环境是外部的网络,IDE所在PC和项目部署环境无法通过如果直接访问IP,则无法使用远程断点方式。(一定要用域名)面向对象的self中static和self的区别是非动态的,存在于哪个类中,self代表哪个类static是动态的,根据哪个类被调用,static指向那个classstatic和self的区别PHP的自动加载机制是什么?在做项目的时候,我们经常会遇到很多类(有自己写的,有来自第三方库的),使用前必须先加载(include/require),但是如果全部手动加载,那就很吃力了:1.代码量巨大,不易维护,浪费时间2.不能按需加载,运行性能低。3.也可能造成统一类的重复加载。因此,PHP5针对这个问题提出了解决方案:automaticLoadingmechanism第一代自动加载机制autoloadfunction__autoload($classname){require_once($classname."class.php");}$person=newPerson("Altair",6);var_dump($person);看到autoload至少要做三件事。首先是根据类名确定类文件名。第二件事是确定类文件所在的磁盘路径(在我们的例子中,是最简单的情况,类和调用它们的PHP程序文件在同一个文件夹中)第三件事是从加载类将磁盘文件导入系统(第三步最简单,使用include/require即可)缺点是:一般项目使用第三方类库,很多时候类名与类文件所在磁盘路径的映射规则位置与我们设置的不同。如果全部写在一个__autoload()函数中,会显得臃肿,难以维护,性能低下。第二代自动加载机制SPLautoload是PHP5提供的SPL扩展,它提供了一种自动加载机制来替代上面的第一代自动加载机制。spl_autoload是SPL默认实现的自动加载函数,功能比较简单。我们不能扩展spl_autoload()函数,如何让spl_autoload自动工作呢?spl_autoload_register()函数在PHP脚本中第一次被调用,没有传入任何参数。一般预定义的spl_autoload()函数不会被SPL扩展##1.注册函数functionmy_autoloader($class){include'classes/'.$类。'.class.php';}spl_autoload_register('my_autoloader');##2.自PHP5.3.0起,匿名函数spl_autoload_register(function($class){include'classes/'.$class.'.class.php';});##3.注册类静态方法--namespaceFoobar;classFoo{staticpublicfunctiontest($className){$className=str_replace("\\",DIRECTORY_SEPARATOR,$className);}}spl_autoload_register(__NAMESPACE__.'\Foo::test');##4.在类方法中调用,注册类静态方法命名空间Foobar;类框架{publicstaticfunctioninit(){require_once(__DIR__.'/functions.php');//自动加载设置spl_autoload_register('self::loadClass');}publicstaticfunctionloadClass($className){$className=str_replace("\\",DIRECTORY_SEPARATOR,$className);}}如果加载的类在命名空间中如果在里面,autoload函数接收到的$class变量会是think\lib\Person,必须带上命名空间。注意如果同时定义了__autoload()函数和spl_autoload_register()函数,会发生什么?首先,spl_autoload_register()起作用。如果没有这个函数,那就找__autoload()函数同时注册多个autoload函数。如何执行?依次执行多个注册的autoload()函数,但是只要执行了require/include,后面注册的函数就不会执行了。在autoload()函数中返回true/false无效。PHP自动加载机制4什么是PHP回调函数风格?匿名函数回调$server->on('Request',function($req,$resp){echo"helloworld";});类静态方法回调类A{staticfunctiontest($req,$resp){echo"helloworld";}}$server->on('Request','A::Test');$server->on('Request',array('A','Test'));函数回调函数my_onRequest($req,$resp){echo"helloworld";}$server->on('Request','my_onRequest');对象方法类A{functiontest($req,$resp){echo"helloworld";}}$object=newA();$server->on('Request',array($object,'test'));
