局部做用域
global/$GLOBALS
才能访问外部全局变量 $var = 'aa'; function showVar(){ echo $var; //没法访问 } showVar(); //Notice通知错误 //正确访问外部全局变量 $var = 'aa'; function showVar(){ echo $GLOBALS['var']; //没法访问 } showVar();
define('BBO','wutao'); function showVar(){ echo BBO; } showVar();//输出‘wutao’
类
(静态属性、静态方法)和对象
(属性、方法)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();
//定义一个Person类 class Person{ }; 外部变量直接访问类中静态方法/属性与实例化 $var = new Person(); $var1 = Person::test(); //函数内部也是直接访问类中静态方法/属性并使用 function demo(){ $var1 = Person::test(); $var = new Person(); }
在类中,方法能够直接调用外部函数或其余类,但不能够直接访问外部变量,外部常量(超全局常量)能够任何地方访问
在类中,属性能够直接访问外部常量(超全局常量),但外部函数、外部变量,其余类就没法访问
$var = '121'; function fn(){} class Student{} define('CONF','121'); class Person{ public $one = new Student(); //不正确,没法访问 public $two = fn(); //不正确,没法访问 public $three = $var; //不正确,没法访问 public $four = CONF; //正确,能够访问 }
系统内置超全局变量/常量用法同样
)//定义超全局常量,不管在函数,方法,仍是外部定义,只要定义,此常量都是超全局常量,哪均可以直接使用 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种基本类型,还能够数组/对象/null数据类型;global/$GLOBALS
才能访问到外部全局变量(通常不推荐这样使用),类中(方法和属性)都没法直接访问外部全局变量 静态变量
在函数中定义的一种变量; static $a = 0;在一次请求响应中,不管函数调用多少次,静态变量的初始化只会执行一次
局部变量
在函数中定义的一种变量; $a = 0;函数执行完,局部变量就会释放
,因此外部没法访问局部变量PHP是手工编译最简化安装
,因此只包含一些基本扩展,其余大部分扩展都没有,后期才按需添加2种
方法一、从新安装PHP (不推荐)
二、使用PHP官方提供的工具phpize来添加 (添加)
phpize工具所在位置:php安装目录/bin/phpize
所需依赖:autoconf工具 yum install autoconf
步骤: 一、cd /php源码目录/ext 二、找到所需安装扩展库,而后cd进入 //例如: cd curl 三、php安装目录/bin/phpize //生成configure文件 四、./configure --with-php-config=/usr/local/php/bin/php-config //生成Makefile 五、make && make install ## 最终.so安装位置在php/bin/php-config中已经指定
php.ini
配置文件中加入extension=curl.so
注意:若是想按上面配置,必须在php.ini中配置
extension_dir="/usr/local/php/ext"
function_exists('ini_set') && ini_set('memory_limit', '1024M');
defined("GREETING") || define("GREETING","Hello world!");
&
表明什么?加与不加&
有什么区别?前置知识
$a = 55; $b = &$a; //引用变量 $b为55 $b = 100; //$b为100 $a为100
一、引用返回方式
(定义函数时, 前面需加&,不然函数调用时只会普通返回
)
<?php function &test(){ static $b = 0; //声明一个静态变量 $b = $b+1; return $b; } $a = test(); //输出 $b 的值为:1 $a = 5; $a = test(); //输出 $b 的值为:2 $a = &test(); //输出 $b 的值为:3 **注意** $a = 5; //$b的值变为了5 $a = test(); //输出 $b 的值为:6 **注意** ?>
二、普通返回方式
(在调用函数前不能使用&
符号,不然会报错)
<?php function test(){ static $b = 0; //声明一个静态变量 $b = $b+1; return $b; } $a = test(); //输出 $b 的值为:1 $a = 5; $a = test(); //输出 $b 的值为:2 $a = &test(); //输出 $b 的值为:3 **报错,不能这样使用** ?>
一、若是定义函数时,前面加&的话,函数调用可使用引用返回
和普通返回
二、若是定义函数时,前面不加&的话,函数调用能够只可以使用普通返回
http://www.test.com/index.php?key=val
参数可使用 $_GET['key'] 获取,但这样的 URL 很不美观
http://www.test.com/index.php/key/val
使用 PATHINFO 模式的 URL ,参数的获取就不可使用 $_GET['key'] 获取了。 必须使用 $_SERVER['PATH_INFO'] 获取
http://www.test.com/key/val
要使用到服务器Apache/Nginx的URL重写功能
http://www.test.com/val.html
不少框架都有路由层,此路由优化后的 URL ,对 SEO 最为友好
在 php.ini 进入以下配置
xdebug.profiler_output_dir="H:\install\phpStudy\tmp\xdebug" xdebug.trace_output_dir="H:\install\phpStudy\tmp\xdebug" zend_extension="H:\install\phpStudy\php\php-5.6.27-nts\ext\php_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
远程调试
一、要检查防火墙是否已经关闭
二、若是你的项目所在环境是外网,就是IDE所在PC与项目部署环境不能经过IP直接访问,则远程断点方式不能使用。(必须使用域名)
在作项目时,咱们常常遇到要用到不少类(有些是本身写的,有些是第三方类库的), 使用前必须先加载(include/require),但若是所有本身手动加载,那么将很吃力不讨好: 一、代码量巨大,很差维护,浪费时间 二、没法作到按需加载,运行性能低下 三、还有可能形成重复加载统一类 因此,PHP5提出解决这一问题方法:自动加载机制
autoload
function __autoload($classname) { require_once ($classname . “class.php”); } $person = new Person(”Altair”, 6); var_dump ($person);
看出autoload至少要作三件事情,
第一件事是根据类名肯定类文件名
第二件事是肯定类文件所在的磁盘路径(在咱们的例子是最简单的状况,类与调用它们的PHP程序文件在同一个文件夹下)
第三件事是将类从磁盘文件中加载到系统中
(第三步最简单,只须要使用include/require便可)
缺点就是:通常项目都是用到第三方类库,不少时候这种类名与与类文件所在的磁盘路径的映射规则与咱们订的不一样,若是所有写在一个__autoload()函数里会很臃肿,难维护,性能低等问题
SPL autoload
PHP5提供的一个SPL扩展
,其中提供的自动加载机制
用于取代
上面第一代自动加载机制spl_autoload是SPL实现的默认的自动加载函数,它的功能比较简单。咱们不能扩展spl_autoload()函数,
怎样让spl_autoload自动起做用呢?在PHP脚本中第一次调用spl_autoload_register()函数,无需传入任何参数,通常不会使用SPL扩展预先定义好的spl_autoload()函数html
## 一、注册函数 function my_autoloader($class) { include 'classes/' . $class . '.class.php'; } spl_autoload_register('my_autoloader'); ## 二、自PHP 5.3.0起可使用一个匿名函数 spl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php'; }); ## 三、注册类静态方法 -- 自 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'); ## 四、在类方法中调用,注册类静态方法 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); } }
若是 加载的类 是在某命名空间
内的话,自动加载函数接受到的$class变量将是think\lib\Person
必须带上命名空间
注意
若是同时定义__autoload()函数和spl_autoload_register()函数,那到底会怎样?
先spl_autoload_register()起效果,若是没有这个函数的话,那么再找__autoload()函数
同时注册多个autoload函数,该如何执行呢?
按顺序执行多个注册的autoload()函数,但只要执行了require/include以后,后面注册的函数就不会执行下去了 autoload()函数内返回return true/false都没有效果
PHP 自动加载机制chrome
匿名函数回调
$server->on('Request', function ($req, $resp) { echo "hello world"; });
类静态方法回调
class A { static function test($req, $resp) { echo "hello world"; } } $server->on('Request', 'A::Test'); $server->on('Request', array('A', 'Test'));
函数回调
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'));