php变量相关函数补遗

serialize 产生一个可存储的值的表示

       string serialize(mixed $var),该函数返回字符串包含了表示$var的字节流,可以存储在任何地方。这有利于储存或传递php的值,同时不丢失其类型和结构。serialize()可处理除了resource之外的任何类型。甚至可以serialize()那些包含了指向其自身引用的数组/对象。当序列化对象时,php将试图在序列化之前调用该对象的成员函数__sleep()。这样就允许对象在序列话之前做任何清除操作。

注意:在php5.3中对象属性将被序列化,但是方法则会丢失。php4打破了此限制,可以同时存储属性和方法。

 

unserialize 从已存储的表示中创建php的值

       mixed unserialize(string $str),该函数对单一的已序列化的变量进行操作,将其转换回php的值。

       若被解序列化的变量是一个对象,在成功地重新构造对象之后,php会自动地尝试调用__wakeup()成员函数。当解序列化一个对象前,必须加载对应的类文件,可以使用php自动加载类库函数或spl扩展,也可以定义unserialize_callback_func指令设置回调函数以供调用,该指令可以通过php.ini、ini_set()或.htaccess定义,每次实例化一个未定义类时它都会被调用。

//serialize()序列化除资源以外类型的变量。
class test{
	public $var;
	public function fun($var){
		echo $var;
	}
}
$test = new test();
//序列化对象
$string = serialize($test);//序列化后的结果为O:4:"test":1:{s:3:"var";N;};由于是php5.3的环境所以无法将方法序列化

//使用unserialize()反序列化表示中创建php值
$string  = 'O:4:"test":1:{s:3:"var";N;}';//这段测试需注释之前所有代码
//使用ini_set()定义unserialize_callback_func指令
ini_set('unserialize_callback_func', 'mytest'); 
//定义回调函数
function mytest($className){
	echo $className;//这句话在本测试中输出test
	//声明该类,因为是测试所以这么写,如果在项目中应该根据className的值加载类文件
	class test{
		public $var;
		public function fun($var){
			echo $var;
		}
	}
}

//反序列化字符串
$test = unserialize($string);
$test->fun('我被 调用了');//fun方法会把我被 调用了输出

//当反序列化false时的示例
$bool = false;
$string = serialize($bool);
//通过比较序列化false和要反序列化对比判定是否反序列化成功
$bool = unserialize($string);
if($bool||$string==serialize(false)){
	echo '反序列化成功!';
}else{
	echo '反序列化失败!';
}
//注意以上判定反序列化成功比较准确,捕捉 E_NOTICE 错误来判断的方式容易出现问题。

 

is_callable 检测参数是否为合法的可调用结构

       boole is_callable(callable $name [,bool $syntax_only = false [,string &$callable_name]]),验证变量的内容是否作为函数调用,可以检查包含有效的函数名变量,或者一个数组,包含了正确编码的对象以及函数名。如果name可以调用则返回true,否则返回false。

       name 要检查的回调函数。

       syntax_only如果设置为true,这个函数仅仅在验证name可能是函数或方法,它仅仅拒绝非字符串,或者未包含能用于回调函数的有效结构,有效的应该包含两个元素,第一个是一个对象或者字符串,第二个元素是一个字符串。

       callable_name接受"可调用的名称“。

//is_callable检测参数是否为合法的可调用结构
function testFunc(){}
class test{
	function testFunc(){}
	private function myFunc(){}
}
$callable = '';

var_dump(is_callable('testFunc'));//boole(true)
//看第二个参数产生的变化
var_dump(is_callable('a',false));//boole(false)
var_dump(is_callable('a',true));//boole(true)
//以上实验中产生的区别是因为当第二个参数设置为true的时候,只检测传入只是否符合php可调用结构语法,并不验证其是否存在

var_dump(is_callable(array('test','myFunc'),false,$callable));//bool(false)
var_dump(is_callable(array('test','myFunc'),true,$callable));//bool(true)
//上面这个例子反应is_callable只能检测共有方法是否存在,应为其函数行为本身就判断即为可调用结构信息是否存在
var_dump(is_callable(array('test','testFunc'),false,$callable));//bool(true)
echo $callable;//test::testFunc
var_dump(is_callable(array(new test(),'testFunc'),true,$callable));//bool(true)
echo $callable;//test::testFunc
//以上两个实验返回可调用名称均为test::testFunc,直接说明这个参数并不是总那么可信
//当遇到上述情况可以使用is_callable()函数判断回调结构是否存在,之后用反射确定调用方式


get_defined_vars 返回所有已定义变量所组成的数组

       array get_defined_vars(void);此函数返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

$b = array(1,1,2,3,5,8);

$arr = get_defined_vars();

// 打印 $b
print_r($arr["b"]);

// 打印 PHP 解释程序的路径(如果 PHP 作为 CGI 使用的话)
// 例如:/usr/local/bin/php
echo $arr["_"];

// 打印命令行参数(如果有的话)
print_r($arr["argv"]);

// 打印所有服务器变量
print_r($arr["_SERVER"]);

// 打印变量数组的所有可用键值
print_r(array_keys(get_defined_vars()));

 

get_resource_type 返回资源类型

       string get_resource_type(resource $handle);此函数返回一个字符串,用于表示传递给它的resource的类型。如果参数不是合法的resource将产生错误。

$c = mysql_connect();
echo get_resource_type($c)."\n";
// 打印:mysql link

$fp = fopen("foo","w");
echo get_resource_type($fp)."\n";
// 打印:file

$doc = new_xmldoc("1.0");
echo get_resource_type($doc->doc)."\n";
// 打印:domxml document

 

import_request_variables将GET/POST/Cookie变量导入到全局作用域中

       bool import_requset_variables( string $type [. string $prefix]),如果你禁止了register_blobals,但又想用到一些全局变量,那么此函数就很有用。可以使用type参数指定需要导入的变量。可以用字母G、P、C分别表示GET、POST、Cookie,这些字母不区分大小写,当使用'gp'时POST变量将使用相同的名字覆盖GET变量,任何GPC  以外的字母都将被忽略。

       prefix参数作为变量名前缀,置于所有被导入到全局作用域的变量之前。所以如果有userid的GET变量,同时提供了前缀'pref_',访问userid的全局变量名为$pref_userid。不建议使用该函数,建议extract()函数实现。


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值