json_decode要求的字符串比较严格
1. 使用UTF-8编码
2. 不能在最后元素有逗号
3. 不能使用单引号
4. 不能有\r,\t,如果有请替换
解决方案 Continue reading
json_decode要求的字符串比较严格
1. 使用UTF-8编码
2. 不能在最后元素有逗号
3. 不能使用单引号
4. 不能有\r,\t,如果有请替换
解决方案 Continue reading
PHP函数,new self(),new static()
1.new static()是在PHP5.3版本中引入的新特性。
2.无论是new static()还是new self(),都是new了一个新的对象。
3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢?
为了探究上面的问题,我们先上一段简单的代码: Continue reading
年前年后没什么活儿,闲着没事时准备把织梦折采集功能提出来,经过改造移植进Destoon网站系统。在改造的过程中,也碰到了很多新知识来学习。
Destoon源码根目录common.inc.php文件约第80多行,源码如下:
if($_POST) extract($_POST, EXTR_SKIP);
if($_GET) extract($_GET, EXTR_SKIP);
注:不要对不能信任的数据使用 extract()
测试实例:
form.html
0 1 2 3 |
<form action="action.php" method="post"> <input type="text" name="username"> <input type="password" name="password"> <input type="submit"> |
action.php
0 1 2 3 4 5 |
<?php extract($_POST); //相当于 //$username = $_POST['username']; //$password = $_POST['password']; ?> |
extract(),它的主要作用是将数组展开,键名(name)作为变量名,元素值(value)为变量值,可以说为数组的操作提供了另外一个方便的工具,比方说,可以很方便的提取$_POST或者$_GET的元素,对表单提交过来的内容不用一一赋值。
int extract ( array $var_array [, int $extract_type [, string $prefix ]] )
extract() 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。对待非法/数字和冲突的键名的方法将根据 extract_type 参数决定。可以是以下值之一:
EXTR_OVERWRITE
如果有冲突,覆盖已有的变量。
EXTR_SKIP
如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME
如果有冲突,在变量名前加上前缀 prefix 。
EXTR_PREFIX_ALL
给所有变量名加上前缀 prefix 。自 PHP 4.0.5 起这也包括了对数字索引的处理。
EXTR_PREFIX_INVALID
仅在非法/数字的变量名前加上前缀 prefix 。本标记是 PHP 4.0.5 新加的。
EXTR_IF_EXISTS
仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。
EXTR_PREFIX_IF_EXISTS
仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。本标记是 PHP 4.2.0 新加的。
EXTR_REFS
将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。
如果没有指定 extract_type ,则被假定为 EXTR_OVERWRITE。
注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。
extract() 的一种可能用法是将 wddx_deserialize() 返回的结合数组中的内容导入到符号表变量中去。
Example#1 extract() 例子
0 1 2 3 4 5 6 7 8 |
<?php /* 假定 $var_array 是 wddx_deserialize 返回的数组*/ $size = “large”; $var_array = array(”color” => “blue”, “size” => “medium”, “shape” => “sphere”); extract($var_array, EXTR_PREFIX_SAME, “mrdede”); echo “$color, $size, $shape, $mrdede_size\n”; ?> |
上例将输出:
blue, large, sphere, medium
$size 没有被覆盖,因为指定了 EXTR_PREFIX_SAME,这使得 $wddx_size 被建立。如果指定了 EXTR_SKIP,则 $mrdede_size 也不会被建立。EXTR_OVERWRITE 将使 $size 的值为“medium”,EXTR_PREFIX_ALL 将建立新变量 $mrdede_color,$mrdede_size 和 $mrdede_shape。
必须使用关联数组,数字索引的数组将不会产生结果,除非用了 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID。
三个函数有相同又有不同,相同点是都可以包含文件,不同点看以下分析。
include "function.inc.php";
include_once "function.inc.php";
require "function.inc.php";
include()
如果被包含内容有问题或不存在,系统则产生一个警告(系统跳过错误,执行以下内容)。
include_once()
比include()功能强,多了一次判断被包含是否被包含过,如果使用include_once()包含多次则执行一次。
require()
如果被包含内容有问题或不存在,系统则产生一个致命的错误(系统崩溃停止)。
比较:
include_once()比include()功能强,功能越强就越多一些算法,效率就没有include()高,所以如果不是绝对必要使用include_once()时,则使用include()。
include()与require():include()根据情况择机去包含文件时使用,也就是说如果被包含文件不存在也不会对脚本的以下执行造成多大的影响;require()固定包含文件时使用,也就是说如果被包含文件不存在则以下程序无法正常运行时,使用require()。