获取PHP类的所以属性和所有方法,可通过反射机制

获取PHP类的所有属性及所有方法:

<?php

class Class1{

    public $var1 = 'var1';

    public $var2 = 'var2';

    private $var3 = 'var3';

 

    public function method1(){}

    public function method2(){}

    private function method3(){}

}
print_r(get_class_methods(Class1));

print_r(get_class_vars(Class1));

//用反射类可以获得私有属性和私有方法

$ref = new ReflectionClass(Class1);
print_r($ref->getMethods());

print_r($ref->getProperties());

输出:

Array

(

    [0] => method1

    [1] => method2

)

Array

(

    [var1] => var1

    [var2] => var2

)

Array

(

    [0] => ReflectionMethod Object

        (

            [name] => method1

            [class] => Class1

        )

 

    [1] => ReflectionMethod Object

        (

            [name] => method2

            [class] => Class1

        )

 

    [2] => ReflectionMethod Object

        (

            [name] => method3

            [class] => Class1

        )

 

)

Array

(

    [0] => ReflectionProperty Object

        (

            [name] => var1

            [class] => Class1

        )

 

    [1] => ReflectionProperty Object

        (

            [name] => var2

            [class] => Class1

        )

 

    [2] => ReflectionProperty Object

        (

            [name] => var3

            [class] => Class1

        )

 

)

$_SERVER[‘PHP_SELF’]|$_SERVER[‘SCRIPT_NAME’]|$_SERVER[‘REQUEST_URI’]区别

$_SERVER[‘PHP_SELF’]、$_SERVER[‘SCRIPT_NAME’] 与 $_SERVER[‘REQUEST_URI’] 三者非常相似,返回的都是与当前 URL 或 PHP 程序文件相关的信息:

$_SERVER['PHP_SELF']:相对于网站根目录的路径及 PHP 程序名称。 $_SERVER['SCRIPT_NAME']:相对于网站根目录的路径及 PHP 程序文件名称。 $_SERVER['REQUEST_URI']:访问此页面所需的 URI 。

一个简单的例子可以看出它们的区别。URL 地址如下: http://www.baidu.com/php/index.php/test/foo?username=hbolive

$_SERVER['PHP_SELF'] 得到:/php/index.php/test/foo $_SERVER['SCRIPT_NAME'] 得到:/php/index.php 
$_SERVER['REQUEST_URI'] 得到:/php/index.php/test/foo?username=hbolive

从该例子可以看出:

$_SERVER['PHP_SELF'] 则反映的是 PHP 程序本身; $_SERVER['SCRIPT_NAME'] 反映的是程序文件本身(这在页面需要指向自己时非常有用);
$_SERVER['REQUEST_URI'] 则反映了完整 URL 地址(不包括主机名)。 其实从各自的命名上,也可以体现出它们之间的细微差别。

特别的,对于如下地址: http://www.baidu.com/

$_SERVER['PHP_SELF'] 得到:/index.php 
$_SERVER['SCRIPT_NAME'] 得到:/index.php 
$_SERVER['REQUEST_URI'] 得到:/

至于有人提到 $_SERVER[‘PHP_SELF’] 与 $_SERVER[‘SCRIPT_NAME’] 在 PHP 以 CGI 模式运行下会有区别。由于 PHP 在 CGI 模式运行下并不多见,测试较为麻烦,在此就不再叙述了。如有这种情况,可注意并自行测试。

PHP和JS判断手机还是电脑访问

当用户使用手机等移动终端访问网站时,我们可以通过程序检测用户终端类型,如果是手机用户,则引导用户访问适配手机屏幕的移动站点。本文将介绍分别使用PHP和JAVASCRIPT代码判断用户终端类型。

PHP版

我们使用PHP的$_SERVER[‘HTTP_USER_AGENT’]来获取手机用户浏览器的用户代理,然后匹配已有的各种手机浏览器代理库,如果含有匹配的关键字,则判断为手机(移动终端)用户。

function is_mobile() { 
 $user_agent = $_SERVER['HTTP_USER_AGENT']; 
 $mobile_agents = array("240x320","acer","acoon","acs-","abacho","ahong","airness","alcatel","amoi", 
 "android","anywhereyougo.com","applewebkit/525","applewebkit/532","asus","audio", 
 "au-mic","avantogo","becker","benq","bilbo","bird","blackberry","blazer","bleu", 
 "cdm-","compal","coolpad","danger","dbtel","dopod","elaine","eric","etouch","fly ", 
 "fly_","fly-","go.web","goodaccess","gradiente","grundig","haier","hedy","hitachi", 
 "htc","huawei","hutchison","inno","ipad","ipaq","iphone","ipod","jbrowser","kddi", 
 "kgt","kwc","lenovo","lg ","lg2","lg3","lg4","lg5","lg7","lg8","lg9","lg-","lge-","lge9","longcos","maemo", 
 "mercator","meridian","micromax","midp","mini","mitsu","mmm","mmp","mobi","mot-", 
 "moto","nec-","netfront","newgen","nexian","nf-browser","nintendo","nitro","nokia", 
 "nook","novarra","obigo","palm","panasonic","pantech","philips","phone","pg-", 
 "playstation","pocket","pt-","qc-","qtek","rover","sagem","sama","samu","sanyo", 
 "samsung","sch-","scooter","sec-","sendo","sgh-","sharp","siemens","sie-","softbank", 
 "sony","spice","sprint","spv","symbian","tablet","talkabout","tcl-","teleca","telit", 
 "tianyu","tim-","toshiba","tsm","up.browser","utec","utstar","verykool","virgin", 
 "vk-","voda","voxtel","vx","wap","wellco","wig browser","wii","windows ce", 
 "wireless","xda","xde","zte"); 
 $is_mobile = false; 
 foreach ($mobile_agents as $device) { 
 if (stristr($user_agent, $device)) { 
 $is_mobile = true; 
 break; 
 } 
 } 
 return $is_mobile; 
}
Javascript版

您也可以直接在前端页面上加入一段Javascript脚本来判断用户的终端类型。Javascript也是通过获取浏览器的user-agent信息,然后匹配已有的user-agent信息库。

if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iOS|iPad|Backerry| 
WebOS|Symbian|Windows Phone|Phone)/i))) { 
    location.replace("http://m.helloweba.com") 
}else{ 
    document.write("请使用手机访问."); 
}

$_SERVER[‘PHP_SELF’]、$_SERVER[‘SCRIPT_NAME’] 与 $_SERVER[‘REQUEST_URI’] 之间的区别

$_SERVER[‘PHP_SELF’]、$_SERVER[‘SCRIPT_NAME’] 与 $_SERVER[‘REQUEST_URI’] 三者非常相似,返回的都是与当前 URL 或 PHP 程序文件相关的信息:

  1. $_SERVER[‘PHP_SELF’]:相对于网站根目录的路径及 PHP 程序名称。
  2. $_SERVER[‘SCRIPT_NAME’]:相对于网站根目录的路径及 PHP 程序文件名称。
  3. $_SERVER[‘REQUEST_URI’]:访问此页面所需的 URI 。

一个简单的例子可以看出它们的区别。URL 地址如下:

http://www.5idev.com/php/index.php/test/foo?username=hbolive
  • $_SERVER[‘PHP_SELF’] 得到:/php/index.php/test/foo
  • $_SERVER[‘SCRIPT_NAME’] 得到:/php/index.php
  • $_SERVER[‘REQUEST_URI’] 得到:/php/index.php/test/foo?username=hbolive

从该例子可以看出:

  1. $_SERVER[‘PHP_SELF’] 则反映的是 PHP 程序本身;
  2. $_SERVER[‘SCRIPT_NAME’] 反映的是程序文件本身(这在页面需要指向自己时非常有用);
  3. $_SERVER[‘REQUEST_URI’] 则反映了完整 URL 地址(不包括主机名)。

其实从各自的命名上,也可以体现出它们之间的细微差别。

特别的,对于如下地址:

http://www.5idev.com/
  • $_SERVER[‘PHP_SELF’] 得到:/index.php
  • $_SERVER[‘SCRIPT_NAME’] 得到:/index.php
  • $_SERVER[‘REQUEST_URI’] 得到:/

至于有人提到 $_SERVER[‘PHP_SELF’] 与 $_SERVER[‘SCRIPT_NAME’] 在 PHP 以 CGI 模式运行下会有区别。由于 PHP 在 CGI 模式运行下并不多见,测试较为麻烦,在此就不再叙述了。如有这种情况,可注意并自行测试。

希望在理解了它们之间的区别之后,以便选择更适合自己程序的来使用。

Wampserver下安装memcache

1.Memcached-32位 下载

http://pan.baidu.com/s/1c1AsMfY

如果上面的不好使,再试试这个:

https://pan.baidu.com/s/1H7iBsgsl8V0cBUr-Wt90_A

2.Memcached-64位 下载

(1)最新版本下载:http://blog.couchbase.com/memcached-windows-64-bit-pre-release-available
(2)本站下载:memcached-win64-1.4.4-14.zip

3.将上述下载文件解压放到某个目录下,例如

D:\wamp\bin\memcached\memcached.exe

4.安装Memcached

在cmd命令行执行以下命令:

D:\wamp\bin\memcached\memcached.exe -d install

[提示错误:failed to install service or service already installed]
解决方法:在系统盘中找到cmd.exe文件,点击右键,以管理员身份运行

5.启动Memcached

D:\wamp\bin\memcached\memcached.exe -d start

测试memcache是否连接成功:

方法一:
>telnet 127.0.0.1 11211

[提示错误:’telnet’ 不是内部或外部命令,也不是可运行的程序或批处理文件。]

注:windows7带有telnet,只是默认没有安装。

解决方法:依次打开“开始”→“控制面板”→“打开或关闭Windows功能”,寻找并勾选“Telnet客户端”,然后点击“确定”。顺利安装后,再输入此命令即可。

方法二:
netstat -an 查看11211是否存在

6.安装Memcached的PHP扩展

(1)php_memcache.dll 下载:php_memcache.dll
(2)将上述文件解压并放到 D:\wamp\bin\php\php5.4.12\ext (可根据自己实际情况放入自己的对应目录)
(3)在php.ini文件中添加下面一行

extension=php_memcache.dll

7.重启Wamp的Apache服务

在phpinfo()界面搜索Memcache,如果有Memcache出现则安装成功!

json格式转数组注意事项

今天遇到一个特别奇葩的问题,json格式明明是正确的,转数组时却就是出不来,后来才发现是文件的编码问题,文件的编码一定要是utf-8无BOM格式,这点一定要切记!切记!

如果想确认json是否正确http://www.kjson.com/

json格式的城市:

<?php
$json = '{
 "北京": {
 "key": 11,
 "defaultvalue": 1,
 "values": {
 "东城区": 1,
 "西城区": 2,
 "崇文区": 3,
 "宣武区": 4,
 "朝阳区": 5,
 "丰台区": 6,
 "石景山区": 7,
 "海淀区": 8,
 "门头沟区": 9,
 "房山区": 11,
 "通州区": 12,
 "顺义区": 13,
 "昌平区": 14,
 "大兴区": 15,
 "怀柔区": 16,
 "平谷区": 17,
 "密云县": 28,
 "延庆县": 29  //注意:此处不能有逗号,否则会出错
 }
 }
}';
print_r(json_decode($json,true));//第二个参数true表示强制转成数组

注意事项:json_decode($json,true)中$json的编码必须是utf-8,不是的要用 iconv(‘GB2312’, ‘UTF-8’, $json)转换。

PHP urlencode

url get传参时,对参数值需要用urlencode()处理,防止参数中含有特殊字符&等,例如:

一产品名称为A&T Plastic,在产品列表中就产生了这样的一个联接
<a href="product.php?name=A&T Plastic">A&T Plastic</a>,
在服务器端接收此参数的时候怎么也无法接收到准确的产品名。
$url = "product.php?name=".urlencode('A&T Plastic');//注意,接收端无需进行urldecode()解码,php会自动解码

PHP 处理特殊字符相关函数

 函数名  释义  介绍
htmlspecialchars() 将与、单双引号、大于和小于号化成HTML格式 &转成&amp;
“转成&quot;
‘ 转成&#039;
<转成&lt;
>转成&gt;
htmlentities() 所有字符都转成HTML格式 除上面htmlspecialchars字符外,还包括双字节字符显示成编码等。
addslashes() 单双引号、反斜线及NULL加上反斜线转义 被改的字符包括单引号 (‘)、双引号 (“)、反斜线 backslash (\) 以及空字符NULL。
stripslashes() 去掉反斜线字符 去掉字符串中的反斜线字符。若是连续二个反斜线,则去掉一个,留下一个。若只有一个反斜线,就直接去掉。
quotemeta() 加入引用符号 将字符串中含有 . \\ + * ? [ ^ ] ( $ ) 等字符的前面加入反斜线 “\” 符号。
nl2br() 将换行字符转成<br>
strip_tags() 去掉HTML及PHP标记 去掉字符串中任何 HTML标记和PHP标记,包括标记封堵之间的内容。注意如果字符串HTML及PHP标签存在错误,也会返回错误。
mysql_real_escape_string() 转义SQL字符串中的特殊字符 转义 \x00  \n  \r  空格  \  ‘  ” \x1a,针对多字节字符处理很有效。mysql_real_escape_string会判断字符集,mysql_escape_string则不用考虑。

PHP基础:字符串格式化

提出问题:

如果有一个字符串$str = ‘99.9’;,怎么样使这个字符串变成99.90呢?

我们需要用到PHP的格式化字符串函数sprintf()

函数说明:sprintf(格式, 要转化的字符串)

返回:格式化好的字符串

例子:

$str = '99.9';
$result = sprintf('%01.2f', $str);
echo $result;//结果显示99.90

解释下,上面例子中的格式

这个 %01.2f 是什么意思呢?

1、这个 % 符号是开始的意思,写在最前面表示指定格式开始了。 也就是 “起始字符”, 直到出现 “转换字符” 为止,就算格式终止。
2、跟在 % 符号后面的是 0, 是 “填空字元” ,表示如果位置空着就用0来填满。
3、在 0 后面的是1,这个 1 是规定整个所有的字符串占位要有1位以上(小数点也算一个占位)。
如果把 1 改成 6,则 $result的值将为 099.90
因为,在小数点后面必须是两位,99.90一共5个占位,现在需要6个占位,所以用0来填满。
4、在 %01 后面的 .2 (点2) 就很好理解了,它的意思是,小数点后的数字必须占2位。 如果这时候,$str 的值为9.234,则 $result的值将为9.23.
为什么4 不见了呢? 因为在小数点后面,按照上面的规定,必须且仅能占2位。 可是 $str 的值中,小数点后面占了3位,所以,尾数4被去掉了,只剩下 23。
5、最后,以 f “转换字符” 结尾。