分类目录归档:php

linux下安装xdebug

安装其实挺简单的  官方就给出了安装方法

Compiling

There is a wizard available that provides you with the correct file to download, and which paths to use.

You compile Xdebug separately from the rest of PHP. Note, however, that you need access to the scripts ‘phpize’ and ‘php-config’. If your system does not have ‘phpize’ and ‘php-config’, you will need to compile and install PHP from a source tarball first, as these script are by-products of the PHP compilation and installation processes. (Debian users can install the required tools with apt-get install php5-dev). It is important that the source version matches the installed version as there are slight, but important, differences between PHP versions. Once you have access to ‘phpize’ and ‘php-config’, do the following:

  1. Unpack the tarball: tar -xzf xdebug-2.2.1.tgz. Note that you do not need to unpack the tarball inside the PHP source code tree. Xdebug is compiled separately, all by itself, as stated above.
  2. cd xdebug-2.2.1
  3. Run phpize: phpize (or /path/to/phpize if phpize is not in your path). Make sure you use the phpize that belongs to the PHP version that you want to use Xdebug with. See this FAQ entry if you’re having some issues with finding which phpize to use.
  4. ./configure –enable-xdebug
  5. make
  6. make install

Configure PHP to Use Xdebug

  1. add the following line to php.ini: zend_extension=”/wherever/you/put/it/xdebug.so” (for non-threaded use of PHP, for example the CLI, CGI or Apache 1.3 module) or: zend_extension_ts=”/wherever/you/put/it/xdebug.so” (for threaded usage of PHP, for example the Apache 2 work MPM or the the ISAPI module). Note: In case you compiled PHP yourself and used –enable-debug you would have to use zend_extension_debug=. From PHP 5.3 onwards, you always need to use the zend_extension PHP.ini setting name, and not zend_extension_ts, nor zend_extension_debug. However, your compile options (ZTS/normal build; debug/non-debug) still need to match with what PHP is using.
  2. Restart your webserver.
  3. Write a PHP page that calls ‘phpinfo()‘ Load it in a browser and look for the info on the Xdebug module. If you see it next to the Zend logo, you have been successful! You can also use ‘php -m’ if you have a command line version of PHP, it lists all loaded modules. Xdebug should appear twice there (once under ‘PHP Modules’ and once under ‘Zend Modules’).

需要注意的就是以下几点

1 如果是yum安装的php  那么你可能没有安装php-devel 那么phpize这个命令是用不了的

那么phpize又是什么东西了? http://php.net/manual/en/install.pecl.phpize.php 这里是官方说明

phpize其实就是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块

比如你想在原来编译好的php中加入memcached或者ImageMagick等扩展模块,可以使用phpize,通过以下几步工作。

2 make install这一步
因为我的php是用yum安装的 所以其文件夹需要root权限才能访问修改 make install 会把编译好的xdebug.so放入到 /usr/lib/php/modules/ 这个文件集 需要root 所以记得切换用户

当然make install这一步其实也可以不用 这一步在这里的唯一作用就是将xdebug.so放入到那个文件夹 如果不make install 我们只需在php.ini加载扩展时写好正确路径就好

3  配置xdebug

直接在最下面配置就好

根据urlencode字串判断其编码是UTF-8还是GBK

思路1 通用方法:
假定它是 GBK 的编码 ,则将其转换成 utf-8 然后再转换回来后与没有转换之前是相等的。这样假设成立,也就是GBK编码。

思路2
iconv转换编码时 如果转换遇到错误 会抛出异常 扑捉异常即可
下面是代码

php类型比较

好记没写博客了 百无聊赖之下 写一篇文章凑数吧
php中switch是进行的弱类型比较 但是js中switch是用的 === 比较

输出 星期一,猴子穿新衣
php手册中有解释

如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。此规则也适用于 switch 语句。

这里是数字0 和空字符串比较 空字符串或者其他非数字字符串 例如 ‘a’ ‘b’ 都会被转为0
0==0 成立
下面列出一个类型详细比较的列子

PHP_SELF SCRIPT_NAME REQUEST_URI 区别

———–网上贴出来的或多或少都有错误 这个是本人亲测 绝对正确!!!————-
PHP_SELF、 SCRIPT_NAME、 REQUEST_URI区别
$_SERVER[PHP_SELF], $_SERVER[SCRIPT_NAME], $_SERVER['REQUEST_URI'] 在用法上是非常相似的,他们返回的都是与当前正在使用的页面地址有关的信息,这里列出一些相关的例子,帮助确定哪些是在你的脚本最适合的。

$_SERVER[’PHP_SELF’]
http://www.yoursite.com/example/ — – — /example/index.php
http://www.yoursite.com/example/index.php — – — /example/index.php
http://www.yoursite.com/example/index.php/ — – — /example/index.php/ (包括斜杠)
http://www.yoursite.com/example/index.php?a=test — – — /example/index.php
http://www.yoursite.com/example/index.php/dir/test — – — /example/index.php/dir/test
http://www.yoursite.com/example/index.php/dir/ — – — /example/index.php/dir/
http://www.yoursite.com/example/index.php/dir/test?av=1 — – — /example/index.php/dir/test
http://www.yoursite.com/example/index.php/dir/test-1-3 — – — /example/index.php/dir/test-1-3
http://www.yoursite.com/example/index.php/dir/test-a-3.html — – — /example/index.php/dir/test-a-3.html
当我们使用$_SERVER['PHP_SELF']的时候,无论访问的URL地址是否有index.php,它都会自动的返回 index.php.但是如果在文件名后面再加斜线的话,就会把后面所有的内容都返回在$_SERVER['PHP_SELF']。?后面的东西这个东西会无视 在有些框架中 参数可以通过-分隔符来传递 这时php_self是会返回的
也就是说 只有碰到问号 才会无视后面的东西 其他分隔符 如- & 之类的 都会返回后面的东西
http://www.haidx.com/admin/admin.php/index/test-1-3.html@4f?abc —–/admin/admin.php/index/test-1-3.html@4f

$_SERVER['REQUEST_URI']
http://www.yoursite.com/example/ — – — /example/
http://www.yoursite.com/example/index.php — – — /example/index.php
http://www.yoursite.com/example/index.php?a=test — – — /example/index.php?a=test
http://www.yoursite.com/example/index.php/dir/test — – — /example/index.php/dir/test
$_SERVER['REQUEST_URI']返回的是我们在URL里写的精确的地址,如果URL只写到”/”,就返回 “/”

就是说这个玩意会返回网址后面的所有部分 不增不减。

$_SERVER['SCRIPT_NAME']
http://www.yoursite.com/example/ — – — /example/index.php
http://www.yoursite.com/example/index.php — – — /example/index.php
http://www.yoursite.com/example/index.php?a=test — – — /example/index.php
http://www.yoursite.com/example/index.php/dir/test — – — /example/index.php
在所有的返回中都是当前的文件名/example/index.php
note:这个玩意最后面的斜杠是不会给你的。。不管你的url是不是以斜杠结尾。。

php引用与global

1首先看一个列子 关于global的

这里把 global $var; 当成是 $var =& $GLOBALS['var']; 的简写。从而将其它引用赋给 $var 只改变了本地变量的引用。
也就是说$var2 =& $var1; 这个语句改变了局部变量$var2的指向为全局变量$var1
global $var2 这句语句造成的效果已经被覆盖了。

2 如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量。

结果:

这里没有声明的都是被设置为null
NOTE:

如果global一个没有被声明的变量 那么这个变量将被创建为null

例如global $obj
3 看下面的列子

运行结果

再来看另外一个奇怪的列子

运行结果

这里和第一个列子差不多 global之后 再给引用 相当于$obj已经变成了局部变量 所以在函数外部看到的是null 当然函数内部是有值的。
注意& new 这种用法基本上已经废弃 会报一个strict错 这里只不过提出来供大家参考

4 引用传递变量

这是通过在函数内建立一个本地变量并且该变量在呼叫范围内引用了同一个内容来实现的
注意在函数调用时没有引用符号——只有函数定义中有。光是函数定义就足够使参数通过引用来正确传递了。在最近版本的 PHP 中如果把 & 用在 foo(&$a);中会得到一条警告说“Call-time pass-by-reference”已经过时了。

5

函数的引用返回

引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。

通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别。至于原因:这是PHP的规定。PHP规定通过$a=&test(); 方式得到的才是函数的引用返回。至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。)

用上面的例子来解释就是:

$a=test()方式调用函数,只是将函数的值赋给$a而已,而$a做任何改变都不会影响到函数中的$b。而通过$a=&test()方式调用函数呢,他的作用是将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方即产生了相当于这样的效果($a=&b;) 所以改变$a的值也同时改变了$b的值,所以在执行了

以后,$b的值变为了5。
这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中。

看看手册上class的列子

Note: 和参数传递不同,这里必须在两个地方都用 &符号——指出返回的是一个引用,而不是通常的一个拷贝,同样也指出 $myValue是作为引用的绑定,而不是通常的赋值。
Note: 如果试图这样从函数返回引用:return ($this->value);,这将不会起作用,因为在试图返回一个表达式的结果而不是一个引用的变量。只能从函数返回引用变量——没别的方法。如果代码试图返回一个动态表达式或 new 运算符的结果,自 PHP 4.4.0 和 PHP 5.1.0 起会发出一条 E_NOTICE 错误。

关于:: 范围解析操作符

范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。

当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。

也就是说静态方法 非静态方法 都可以用::访问

A::test(); 结果没有$this 说明此时类没有实例化 此时不用用$this调用变量 但是可以用self:: 调用静态成员

note: self::可以调用非静态方法就是这一个原理 self其实就是代指当前类名(A)
self::不可以访问非静态成员是因为 ::不能访问非静态成员 但是可以访问类常量。

php类中private属性继承问题

首先 这个题目就有点问题 因为private属性是不能被继承的
请仔细看这句话 如果父类有私有的属性。那么父类的方法只为父类的私有属性服务。
下面通过一系列列子来加深理解.
这个例子看起来很奇怪,在子类中重新定义了一个属性$sal,系统却返回了父类的属性。

继续阅读

php遍历目录 支持中文目录和中文文件

php 2038问题

32位系统getTimestamp()返回错误 因为public int DateTime::getTimestamp ( void )
很显然 大于2038的时间戳int是保持不了的 要不然也不会用到DateTime这个内置的类了

php正则表达式的一些小问题

如果匹配一个\ 那么必须用 ‘\\\\’来匹配
因为首先\\\\ 会被解析为 \\ 然后在preg_match()传过去的时候 正则表达式在解析一次才是 \本身
那么有人会问 为什么这种形式的不要那么多\ 比如
$mod=’/a\sc/’;
$str=’a c’;
preg_match($mod,$str);
这样也可以匹配 首先$mod是单引号 在单引号中只有 \ 和 ‘ 才会转义 那如果改为$mod=”/a\sc/”捏?
答案照样可以 因为\s 转义不了 转移不了的东西 \是不会消失的
我们可以echo一下$mod 为 /a\sc/
如果$mod=”/a\\sc/” 我们发现结果还是为/a\sc/