【www.5929.com】线性表的顺序存储结构PHP落成,PHP中文手册2

1.PHP中的数组实际上是雷打不动映射,可以算作数组,列表,散列表,字典,集合,栈,队列,不是一直的尺寸
2.数组定义中多个单元都选取了同一个键名,则只使用了最终一个,从前的都被覆盖了
3.想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的先头加上记号
&
4.PHP
的引用是别名,就是三个不等的变量名字指向相同的始末;“默许情状下对象是由此引用传递的”。但其实那不是完全正确的,当目标作为参数传递,作为结果回到,或者赋值给其它一个变量,其它一个变量跟原先的不是援引的涉及,只是她们都封存着同一个标识符的正片

PHP数组

PHP中的数组实际上是一个平稳映射。映射是一种把values关联到keys的类型。此类型在重重上边做了优化,由此能够把它当从真正的数组,或列表(向量),散列表,字典,集合,栈,队列以及更加多可能性。数组元素的值也可以是另一个数组。树形结构和多维数组也是同意的。

PHP自定义函数

PHP是弱类型语言,相对其他语言来说相比较自由和灵活,函数名对大小写不敏感。
函数名和 PHP
中的其它标识符命名规则一律。有效的函数名以字母或下划线打头,前面跟字母,数字或下划线。可以用正则表明式表示为:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*。

<?php
class Sqlist{
        public $data=array();
        public $length=0;
}
//插入元素
function listInsert(&$sqlist,$i,$e){
        //位置是否超出范围
        if($i<1 && $i>$sqlist->length+1){
                return false;
        }   
        //从插入位置开始,后面的所有元素都退一位
        if($i<=$sqlist->length){//要插入的位置不是在尾部
                for($k=$sqlist->length-1;$k>=$i-1;$k--){
                        $sqlist->data[$k+1]=$sqlist->data[$k];
                }   
        }   
        //新元素插入
        $sqlist->data[$i-1]=$e;
        //长度加1
        $sqlist->length++;
        return true;
}
//获取元素
function getElement($sqlist,$i,&$e){
        if($sqlist->length==0 || $i<1 || $i>$sqlist->length){
                return false;
        }   
        $e=$sqlist->data[$i-1];
        return true;
}
//删除元素
function listDelete($sqlist,$i,&$e){
        if($sqlist->length==0 || $i<1 || $i>$sqlist->length){
                return false;
        }   
        $e=$sqlist->data[$i-1];
        //如果是最后一个元素
        if($i!=$sqlist->length){
                //在删除位置之后的元素,往前移动一位
                for($k=$i-1;$k<=$sqlist->length-1;$k++){
                        $sqlist->data[$k]=$sqlist->data[$k+1];
                }   
        }   

        $sqlist->length--;
}

//插入线性表
$sqlist=new Sqlist();
listInsert($sqlist,1,"Tau");
listInsert($sqlist,1,"Shihan");
//获取元素
$e="";
getElement($sqlist,2,$e);
echo $e."\n";//输出Tau

//删除元素
listDelete($sqlist,1,$e);


var_dump($sqlist);

语法

11.老大处理

Example #1 浮现函数用途的伪代码

<?php
function aierui()
{
    # 业务逻辑
}

?>

  

概念数组array( )

可以用array(
)语言结构来新建一个array。它承受任意数量用逗号分隔的键(key)=>值(value)对。

array(key=>value)
//键(key)可是是一个整数(integer)或字符串(string)
//值(value)可以是任意类型的值

<?php
$arr = array("foo"=>"bar", 12=>true);

echo $arr["foo"]; //bar
echo $arr[12]; //1
?>

key能够是integer或者string。即使key是一个integer的规范表示,则被解说为整数(例如”8″将被解说为8,而”08″将被分解为”08″)。key中的浮点数被取整为integer。在PHP中索引数组与涉及数组是一律的,他们都足以同时涵盖整型和字符串的下标。
值可以是随便的PHP类型。

<?php
$arr = array("somearray"=>array(6=>5, 13=>9, "a"=>42));

echo $array["somearray"][6]; //5
echo $array["somearray"][13]; //9
echo $array["somearray"][a]; //42
?>

假使对交付的值没有点名键名,则取当前最大的平头索引值,而新的键名将是键名该值加一。假若指定的键名已经有了值,则该值会被遮住。

<?php
//这个数组与下面的数组相同....
array(5=>43, 32, 56, "b"=>12);

//...
array(5=>43, 6=>32, 7=>56, "b"=>12);
?>

Example #2 有规范的函数

当一个函数是有标准化被定义时,必须在调用函数以前定义。

<?php

$flag = true;

star();
/* 不能在此处调用star()函数,   因为它还不存在,但可以调用bar()函数。*/
if($flag){
    function  star(){
        echo "star--function";
    }
}

//判断$flag后为真就可以调用star()函数
function bar()
{
    return "bar";
}

Warning

自PHP4.3.0起,上述的索引生成方法改变了。近期如若给一个脚下最大键名是负值的数组添加一个新值,则新生成的目录将为(0)。在此从前新生成的目录为眼前最大索引加一,和正在的目录相同。
动用TRUE作为键名将使integer1成为键名。使用FALSE作为键名将使integer0成为键名。使用NULL作为键名将等同于使用空字符串。使用空字符串作为键名将新建(或掩盖)一个用空字符串作为键名的值,那和用空的方括号分裂。
无法用数组和对象作为键(key)。那样会造成一个警示:Illegal offset type。

用户可以用自定义的可怜处理类来扩大 PHP
内置的不得了处理类。以下的代码表达了在松手的万分处理类中,哪些属性和方法在子类中是可访问和可三番五次的。译者注:以下那段代码只为表明内置十分处理类的结构,它并不是一段有实际意义的可用代码。

Example #3 函数中的函数

function aierui($str)
{
    $a = 'some';
    echo $str;
    function add($str1)
    {
        echo $a.$str1;
    }
}
//不能够直接先调用aierui()函数内的add函数,
// 报错 Fatal error: Call to undefined function add()
// 
aierui('aierui');

add("like");

//这种情况并且拿不到外函数的变量 提示Notice: Undefined variable: str 

小例:一般就是在自定义中调用PHP内置的函数越发常见,当然也得以在函数内自定调用,个人不提议,依然在函数外定义去调用吧,

   function convertDate($date,$locale,$length)
   {
       $monthNames = array(
               "en" => array(
                   "full" => array(1=>'January','February','March','April','May',
                   'June','July','August','September','October','November','December'),

                   "short" => array(1=>'Jan','Feb','Mar','Apr','May','Jun',
                   'Jul','Aug','Sep','Oct','Nov','Dec')
               ),
               "es" => array(
                   "full" => array(1=>'Enero','Febrero','Marzo','Abril','Mayo',
                   'Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Deciembre'),

                   "short" => array(1=>'Ene','Feb','Mar','Abr','May','Jun',
                   'Jul','Ago','Sep','Oct','Nov','Dec')
               ),
           );
       $exploded = explode("-",$date);
       $year = $exploded[0];
       $month = $exploded[1];
       $day = $exploded[2];

       $month = $monthNames[$locale][$length][$month];
       $date = $day . " " . $month . ", " . $year;
       return $date;
   }

echo convertDate("2016-8-23","en","full");//23 August, 2016

用方括号的语法新建/修改

可以通过明示的设定值来改变一个存活的数组。
那是透过在方括号内指定键名来给数组赋值已毕的。也足以省略键名,在那种景况下给变量名加上一对空的方括号(“[]”)。

$arr[key] = value;
$arr[] = value;
//key可以是integer或string
//value可以是任意类型的值

假若$arr还不存在,将会新建一个。那也是一种概念数组的替换方法。要改变一个值,只要给它赋一个新值。假使要删减一个键名/值对,要对它用unset()。

<?php
  $arr = array(5 => 1, 12 => 2);
  $arr[] = 56;  //This is the same as $arr[13] = 56;
                    // at this point of the script
  $arr["x"] = 42;  //This adds a new element to
                        //the array with key "x"
   unset($arr[5]);  //This removes the element from the array
   unset($arr);  //This deletes the whole array
?>

NOTE:
如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值 + 1。如果当前还没有整数索引,则键名将为 0。如果指定的键名已经有值了,该值将被覆盖。
注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:
<?php
//创建一个简单的数组
$array = array(1, 2, 3, 4, 5);
print_r($array);

//现在删除其中的所有元素,但保持数组本身不变:
foreach ($array as $i => $value){
  unset($array[$i]);
}
print_r($array);

//添加一个单元(注意新的键名是5,而不是你可能以为的0)
$array[] = 6;
print_r($array);

//重新索引
$array = array_values($array);
$array[] = 7;
print_r($array);
?>

如上例子会输出:

Array(
  [0] => 1
  [1] => 2
  [2] => 3
  [3] => 4
  [4] => 5
)
Array(
)
Array(
  [5] => 6
)
Array(
  [0] => 6
  [1] => 7
)

<?phpclass Exception{protected $message = 'Unknown exception'; // 异常信息protected $code = 0; // 用户自定义异常代码protected $file; // 发生异常的文件名protected $line; // 发生异常的代码行号function __construct($message = null, $code = 0);final function getMessage(); // 返回异常信息final function getCode(); // 返回异常代码final function getFile(); // 返回发生异常的文件名final function getLine(); // 返回发生异常的代码行号final function getTrace(); // backtrace() 数组final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息/* 可重载的方法 */function __toString(); // 可输出的字符串}?>

Example #4 递归函数

递归函数不难的领会就是投机调用自己,但是要防止递归函数/方法调用超越100-200 层,因为可能会使堆栈崩溃从而使当前脚本终止。
无限递归可视为编程错误。

function recursion($a)
{
    if ($a < 20) {
        echo "$a\n";
        recursion($a + 1);
    }
}

recursion(12);

实用函数

Note:

unset()函数允许删除数组中的某个键。但要注意数组将不会重建索引。If a true "remove and shift" behavior is desired, the array can be reindexed using the array_values() function.

<?php
 $a = array(1=> 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/*will produce an array that would have been defined as
   $a = array(1=> 'one', 3 => 'three');
   and NOT
   $a = array(1 => 'one', 2=>'three');
*/

  $b = array_values($a);
  //Now $b is array(0=>'one', 1=>'three')
?>

foreach控制结构是尤其用于数组的。它提供了一个简易的点子来遍历数组。

倘诺运用自定义的类来扩充内置很是处理类,并且要重复定义构造函数的话,指出还要调用 parent::__construct()来检查有着的变量是还是不是已被赋值。当目的要出口字符串的时候,可以重载 __toString() 并自定义输出的体裁。

函数的参数

PHP对象

要开创一个新的目的object,使用new语句实例化一个类:
<?php
class foo{
function do_foo(){
echo “Doing foo.”;
}
}

$bar = new foo;
$bar->do_foo();
?>

增添 PHP 内置的优良处理类

Example #1 向函数传递数组

透过参数列表可以传递信息到函数,即以逗号作为分隔符的表明式列表。参数是从左向右求值的。

function takes_array($input)
{    
      echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}

更换为对象

假定将一个目的转换成对象,它将不会有其他变化。要是其余任何项目标值被转换成对象,将会实例化一个内置类stdClass的靶子。假诺该值为NULL,则新的实例为空。数组转换成对象将使键名成为属性名并兼有相对应的值。对于任何其余的值,名为scalar的积极分子变量将含有该值。

<?php
  $obj = (object) 'ciao';
  echo $obj->scalar;  //outputs 'ciao'
?>

<?php// 自定义一个异常处理类class MyException extends Exception{    // 重定义构造器使 message 变为必须被指定的属性    public function __construct($message, $code = 0) {        // 自定义的代码    // 确保所有变量都被正确赋值        parent::__construct($message, $code);}// 自定义字符串输出的样式public function __toString() {    return __CLASS__ . ": [{$this->code}]: {$this->message}\n";}public function customFunction() {    echo "A Custom function for this type of exception\n";    }}//创建一个用于测试异常处理机制的类class TestException{public $var;const THROW_NONE = 0;const THROW_CUSTOM = 1;const THROW_DEFAULT = 2;function __construct($avalue = self::THROW_NONE) {switch ($avalue) {case self::THROW_CUSTOM:// 抛出自定义异常throw new MyException('1 is an invalid parameter', 5);break;case self::THROW_DEFAULT:// 抛出默认的异常throw new Exception('2 isnt allowed as a parameter', 6);break;default:// 没有异常的情况下,创建一个对象$this->var = $avalue;break;}}}// 例子 1try {$o = new TestException(TestException::THROW_CUSTOM);} catch (MyException $e) { // 捕获异常echo "Caught my exception\n", $e;$e->customFunction();} catch (Exception $e) { // 被忽略echo "Caught Default Exception\n", $e;}// 执行后续代码var_dump($o);echo "\n\n";// 例子 2try {$o = new TestException(TestException::THROW_DEFAULT);} catch (MyException $e) { // 不能匹配异常的种类,被忽略echo "Caught my exception\n", $e;$e->customFunction();} catch (Exception $e) { // 捕获异常echo "Caught Default Exception\n", $e;}// 执行后续代码var_dump($o);echo "\n\n";// 例子 3try {$o = new TestException(TestException::THROW_CUSTOM);} catch (Exception $e) { // 捕获异常echo "Default Exception caught\n", $e;}// 执行后续代码var_dump($o);echo "\n\n";// 例子 4try {$o = new TestException();} catch (Exception $e) { // 没有异常,被忽略echo "Default Exception caught\n", $e;}// 执行后续代码var_dump($o);echo "\n\n";?>

通过引用传递参数

默认意况下,函数参数通过值传递(因此即便在函数内部改变参数的值,它并不会转移函数外部的值)。如果希望允许函数修改它的参数值,必须经过引用传递参数。

比方想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的先头加上记号
&:
Example #1 用引用传递函数参数

function add_some_extra(&$string)
{
    $string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str;    // 'This is a string, and something extra.'

PHP资源类型

资源是一种特有变量,保存了到表面资源的一个引用。资源是通过专门的函数来确立和应用的。
Note:资源类型是PHP4引进的。

12.生成器

默许参数的值

本条有点像 C++ 风格的标量参数默许值,如下所示:

function makecoffee($type = "cappuccino")
{
    return "Making a cup of $type.\n";
}
echo makecoffee();//Making a cup of cappuccino.
echo makecoffee(null);//Making a cup of .
echo makecoffee("espresso");//Making a cup of espresso.

默许值必须是常量表明式,不可能是比如说变量,类成员,或者函数调用等。

专注当使用默许参数时,任何默许参数必须放在其他非默许参数的左侧;否则,函数将不会依据预期的情状工作。

function makeyogurt($type = “acidophilus”, $flavour) (×)
function makeyogurt($flavour, $type = “acidophilus”) (√)

PHP NULL

独特的NULL值表示一个变量没有值。NULL类型唯一可能的值就是NULL。
Note:NULL类型是PHP4引进的。

在下列景况下一个变量被认为是NULL:
+被赋值为NULL
+尚未被赋值
+被unset( )

PHP内置函数

那个内置函数是我在档次中用到的可比多

语法

NULL类型只有一个值,就是大大小小写不灵敏的第一字NULL。

<?php
$var = NULL;
?>

生成器允许你在 foreach代码块中写代码来迭代一组数据而不必要在内存中开创一个数组,
那会使您的内存达到上限,或者会占用可观的处理时间。相反,你可以写一个生成器函数,就如一个一般的自定义函数一样,
和平时函数只回去一回不一致的是,
生成器可以按照须要 yield 数次,以便生成须求迭代的值。

检测变量

is_string()、is_array()、is_object()、is_float()、
is_null()、isset、empty

自身在那5个月多的年月里方面用到最多是背后多个,看上去差别。但却又相同之处。
empty
  如果 变量 是非空或非零的值,则 empty() 重回FALSE。换句话说,””、0、”0″、NULL、FALSE、array()、var $var、未定义;
以及从未其余性质的目的都将被认为是空的,借使 var 为空,则赶回 TRUE。
isset
  如若 变量 存在(非NULL)则赶回 TRUE,否则再次回到FALSE(包涵未定义)。变量值设置为:null,重回也是false;unset一个变量后,变量被撤回了。注意,isset对于NULL值变量,特殊处理。
is_null
  检测传入值【值,变量,表达式】是还是不是是null,唯有一个变量定义了,且它的值是null,它才回到TRUE
. 其余都回来 FALSE 【未定义变量传入后会出错!】

过滤掉的范围从大到小empty>isset>is_null
也有人说isset是言语结构、is_null是函数。鸟哥分析isset与is_null区别

转换到NULL

将一个变量转换为null类型将会去除该变量并且unset它的值。

<?phpfunction xrange($start, $limit, $step = 1) {    if ($start < $limit) {        if ($step <= 0) {            throw new LogicException('Step must be +ve');}        for ($i = $start; $i <= $limit; $i += $step) {            yield $i;        }    } else {        if ($step >= 0) {            throw new LogicException('Step must be -ve');        }        for ($i = $start; $i >= $limit; $i += $step) {            yield $i;        }    }}/* Note that both range() and xrange() result in the same* output below. */echo 'Single digit odd numbers from range(): ';foreach (range(1, 9, 2) as $number) {    echo "$number ";}echo "\n";echo 'Single digit odd numbers from xrange(): ';foreach (xrange(1, 9, 2) as $number) {    echo "$number ";}?>

处理string用的放权函数

最简便直接出口字符串
echo() 输出字符串
print()输出一个或七个字符串。
printf() 输出格式化的字符串。
[strlen()] 重临字符串的长度。
[substr()] 重返字符串的一有的。
[strtolower()]把字符串转换为小写字母。
[strtoupper()]把字符串转换为大写字母。
[strstr()]摸索字符串在另一字符串中的第二回面世(对大小写敏感)。
[str_replace()]轮换字符串中的一些字符(对大小写敏感)。
[explode()]把字符串打散为数组。
[implode()]回到由数组元素组合成的字符串。[join()]和那一个函数一样
mb_www.5929.com,strpos — 查找字符串在另一个字符串中首次出现的职位
[strcmp()]相比四个字符串(对大小写敏感)看到过外人用那函数相比较一次输入的密码

PHP本文档中选用的伪类型

Single digit odd numbers from range():  1 3 5 7 9 
Single digit odd numbers from xrange(): 1 3 5 7 9 

拍卖array用的停放函数

自身前面写过有关处理数组部分,这里附上链接就行吧
读书PHP的数组总括【经验】
拍卖数组,在项目中本身的专门有感动。由于是野路子出身,很多事物不通晓。
在此处留部分题材吗

  • 二维数组的遍历、遍历时转换数据格式等
    如三目运算符对数据状态的判定、时间戳转换成现实的年华格式。
  • 询问结果某个字段是json格式怎么方便在TP view页面上获得
  • 修改复选框后从数据库中删除没用的数码
  • 留存父级id时,怎么将父级和child一块儿重新排序 输出
  • 字符串的拼凑更加是和sql公用的时
  • 一个表单提交过来是一个二维数组(倘诺里面array为1,外面为2),将array1存到另一个表中,甚至是三位
    四维数组的时候怎么处理,三维能够品尝运用TP 批量添加方法addAll()

贴一段代码

        $data['product_id'] = $this->shop_activity_product->where(" activity_id = " .$id)->field("product_id")->select();
        foreach ($data['product_id']  as $value) {
            $value = implode(",", $value);
            $temp[] = $value;
        }
        $t = "";
        foreach ($temp as  $value) {
            $t .="".$value."".",";
        }
          $data['product_id'] = substr($t, 0);
        if($data['gift'] == 1 && $data['gift_text'] != ''){ //搭赠产品及规则信息
            $gift_text = json_decode($data['gift_text']);
            $data['gift_text'] = array();
            foreach($gift_text as $k=>$v){
                $row = $this->shop_product
                        ->alias("sp")
                        ->join("shop_goods as sg ON sg.id = sp.goods_id")
                        ->field("sg.title,sp.*")
                        ->where("sp.id = %d",$v->product_id)
                        ->find();

                $spec = json_decode($row['spec']);
                $row['spec'] = '';
                if(!empty($spec)){
                    foreach($spec as $k1=>$v1){
                        $row['spec'] .= $v1->sku_text.':'.$v1->text.',';
                    }
                }
                $row['spec'] = rtrim($row['spec'],',');
                $data['gift_text']['product_id'] = $v->product_id;
                $data['gift_text']['product_name'] = $row['title'];
                $data['gift_text']['product_spec'] = $row['spec'];
                $data['gift_text']['product_num'] = $v->num;
                $data['gift_text']['jine'] = $v->jine;
                $data['gift_text']['shuliang'] = $v->shuliang;
            }
        }

mixed

mixed说贝拉米(Bellamy)(Friso)个参数可以承受所有的PHP类型,str_replace()可以承受字符串和数组。

Comparing generators with Iterator objects

The primary advantage of generators is their simplicity. Much less
boilerplate code has to be written compared to implementing
an【www.5929.com】线性表的顺序存储结构PHP落成,PHP中文手册2。Iterator class, and the code is generally much more readable. For
example, the following function and class are equivalent:

<?phpfunction getLinesFromFile($fileName) {    if (!$fileHandle = fopen($fileName, 'r')) {        return;}while (false !== $line = fgets($fileHandle)) {    yield $line;}fclose($fileHandle);}// versus...class LineIterator implements Iterator {    protected $fileHandle;    protected $line;    protected $i;    public function __construct($fileName) {        if (!$this->fileHandle = fopen($fileName, 'r')) {            throw new RuntimeException('Couldn\'t open file "' . $fileName . '"');        }    }    public function rewind() {        fseek($this->fileHandle, 0);        $this->line = fgets($this->fileHandle);        $this->i = 0;    }    public function valid() {        return false !== $this->line;    }    public function current() {        return $this->line;    }    public function key() {        return $this->i;    }    public function next() {        if (false !== $this->line) {        $this->line = fgets($this->fileHandle);        $this->i++;        }    }    public function __destruct() {        fclose($this->fileHandle);        }    }?>

13.引用

<?php$a =& $b;    //这意味着 $a 和 $b 指向了同一个变量。$a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者·            //相反,而是 $a 和 $b 指向了同一个地方。?>

假设持有引用的数组被拷贝,其值不会消除引用。对于数组传值给函数也是这么。如若对一个未定义的变量举办引用赋值、引用参数传递或引用再次来到,则会自动创制该变量。

<?php

function foo(&$var) { }

foo($a); // $a is “created” and assigned
to null

$b = array();

foo($b[‘b’]);

var_dump(array_key_exists(‘b’, $b)); //
bool(true)

$c = new StdClass;

foo($c->d);

var_dump(property_exists($c, ‘d’)); //
bool(true)

?>

无异于的语法可以用在函数中,它回到引用,以及用在 new运算符中(PHP
4.0.4 以及后来版本):

<?php$bar =& new fooclass();$foo =& find_var($bar);?>

若是在一个函数内部给一个声称为 global的变量赋于一个引用,该引用只在函数内部可知。可以因而接纳 $GLOBALS 数组幸免那一点。在函数内引用全局变量:

<?php$var1 = "Example variable";$var2 = "";function global_references($use_globals){    global $var1, $var2;    if (!$use_globals) {        $var2 =& $var1; // visible only inside the function    } else {        $GLOBALS["var2"] =& $var1; // visible also in global context    }}global_references(false);echo "var2 is set to '$var2'\n"; // var2 is set to ''global_references(true);echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable'?>

把 global $var; 当成是 $var =&
$GLOBALS[‘var’];
 的简写。从而将别的引用赋给 $var 只改变了本土变量的引用。

若是在 foreach语句中给一个富有引用的变量赋值,被引用的目的也被改变。

<?php

$ref = 0;

$row =& $ref;

foreach (array(1, 2, 3) as $row) {// do
something}

echo $ref; // 3 – last element of the
iterated array

?>

引用做的第二件事是用引用传递变量。那是经过在函数内创立一个本地变量并且该变量在呼唤范围内引用了同一个情节来兑现的。例如:

<?phpfunction foo(&$var){    $var++;}$a=5;foo($a);?>

将使 $a 变成
6。那是因为在 foo 函数中变量 $var 指向了和 $a 指向的同一个内容。越来越多详细分解见引用传递。

引用做的第三件事是引用重临。引用不是指针。

可以将一个变量通过引用传递给函数,那样该函数就可以修改其参数的值。

<?phpfunction foo(&$var){$var++;}$a=5;foo($a);// $a is 6 here?>

小心在函数调用时从没引用符号——唯有函数定义中有。光是函数定义就丰裕使参数通过引用来不易传递了

以下内容可以由此引用传递:

【www.5929.com】线性表的顺序存储结构PHP落成,PHP中文手册2。变量,例如 foo($a);New
语句,例如 foo(new foobar());从函数中回到的引用

其余其余说明式都无法由此引用传递,结果未定义。

<?phpfunction bar(){ // Note the missing &$a = 5;return $a;}foo(bar()); // 自 PHP 5.0.5 起导致致命错误foo($a = 5) // 表达式,不是变量foo(5) // 导致致命错误?>

引用重临用在当想用函数找到引用应该被绑定在哪一个变量上边时。不要用再次来到引用来增添属性,引擎丰裕聪明来自己开展优化。仅在有合理的技术原因时才回来引用!要重回引用,使用此语法:

<?phpclass foo {    public $value = 42;    public function &getValue() {        return $this->value;    }}$obj = new foo;$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.$obj->value = 2;echo $myValue; // prints the new value of $obj->value, i.e. 2.?>

本例中 getValue 函数所重临的靶子的特性将被赋值,而不是拷贝,就和尚未用引用语法一样。和参数传递差异,这里不可不在多少个地方都用 &符号——指出重回的是一个引用,而不是平常的一个拷贝,同样也提出 $myValue是作为引用的绑定,而不是平时的赋值。当
unset
一个引用,只是断开了变量名和变量内容之间的绑定。那并不意味着变量内容被灭绝了。

<?php$a = 1;$b =& $a;unset($a);?>

不会
unset $b,只是 $a。引用定位:

global引用:当用 global
$var
 表明一(Wissu)个变量时实际上确立了一个到全局变量的引用。也就是说和这样做是一样的:

<?php$var =& $GLOBALS["var"];    //这意味着,例如,unset $var 不会 unset 全局变量。?>

$this:在一个对象的章程中,$this 永远是调用它的目标的引用。

14.预概念变量

超全局变量 — 超全局变量是在全体作用域中一贯可用的放权变量PHP
中的许多预订义变量都是”超全局的”,那代表它们在一个剧本的全套功效域中都可用。在函数或情势中无需实践 global
$variable;
 就能够访问它们。这一个超全局变量是:

$GLOBALS;$_SERVER;$_GET;$_POST;$_FILES;$_COOKIE;$_SESSION;$_REQUEST;$_ENV

默许情形下,所有的超全局变量都是可用的。不过,有局地命令会影响那种可用性。

$GLOBALS — 引用全局功效域中可用的上上下下变量一个分包了整整变量的全局组合数组。变量的名字就是数组的键。

<?phpfunction test() {$foo = "local variable";echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";//$foo in global scope: Example contentecho '$foo in current scope: ' . $foo . "\n";//$foo in current scope: local variable}$foo = "Example content";test();?>

“Superglobal”也号称自动化的全局变量。那就意味着其在本子的持有成效域中都是可用的。不必要在函数或措施中用global
$variable;
 来访问它。与有着其余超全局变量不一样,$GLOBALS在PHP中连连可用的。

$_SERVER 是一个带有了例如头信息(header)、路径(path)、以及脚本地方(script
locations)等等新闻的数组。那一个数组中的项目由 

Web
服务器创立。在 $_SERVER 中,你可能可以,也许不可知找到下边的这么些元素。列举:

‘PHP_SELF’:当前举办脚本的文本名,与
document root
有关。例如,在地点为  的台本中行使 

$_SERVER[‘PHP_SELF’] 将得到 /test.php/foo.bar。

‘SERVER_ADDR’:当前运作脚本所在的服务器的 IP
地址。

‘SERVER_NAME’:当前运行脚本所在的服务器的主机名。如若脚本运行虚拟主机,该名称是由越发虚拟主机所设置的值决定。

‘SERVER_PROTOCOL’:请求页面时通讯协议的称呼和版本。例如,”HTTP/1.0″。

‘REQUEST_METHOD’:访问页面使用的哀求方法;例如,”GET”,
“HEAD”,”POST”,”PUT”。

‘REQUEST_TIME’:请求伊始时的时光戳。从
PHP 5.1.0 起可用。

‘QUERY_STRING’:query
string(查询字符串),要是有的话,通过它举办页面访问。

‘HTTP_HOST’:当前请求头中 Host: 项的内容,即使存在的话。

‘HTTP_REFERER’:指引用户代理到当前页的前一页的地址(若是存在)。由
user agent
设置决定。并不是富有的用户代理都会安装该项,有的还提供了改动 HTTP_REFERER 的功力。简言之,该值并不可信。

‘HTTP_USER_AGENT’:当前请求头中 User-Agent: 项的内容,即使存在的话。该字符串评释了拜访该页面的用户代理的音讯。

‘REMOTE_ADDR’:浏览当前页面的用户的 IP
地址。

‘REMOTE_HOST’:浏览当前页面的用户的主机名。DNS
反向解析不借助于用户的 REMOTE_ADDR。

‘SERVER_PORT’:Web
服务器使用的端口。默许值为 “80”。即便应用 SSL
安全连接,则那么些值为用户安装的 HTTP 端口。

$_GET:通过 URL
参数传递给当下剧本的变量的数组。GET 是通过 urldecode() 传递的。

$_POST:通过 HTTP POST
方法传递给当下剧本的变量的数组。

$_FILES:通过 HTTP POST
格局上传播当前剧本的类型的数组。

$_REQUEST — HTTP Request
变量,以命令行格局运行时,将涵盖 argv 和 argc 新闻;它们将设有于 $_SERVER数组。

由于 $_REQUEST 中的变量通过 GET,POST
和 首席执行官KIE
输入机制传递给脚本文件,因而得以被远程用户篡改而并不可信。那个数组的项目及其顺序看重于
PHP 的 variables_order 指令的布局。

$_SESSION:当前剧本可用 SESSION
变量的数组。

move_uploaded_file() –
将上传的文件移动到新岗位;import_request_variables() – 将
GET/POST/Cookie 变量导入到全局功用域中;session_start() –
启动新会话或者重用现有会话;getenv() – 获取一个环境变量的值;

$_ENV:通过环境艺术传送给当下剧本的变量的数组。这么些变量被从
PHP 解析器的运作环境导入到 PHP 的大局命名空间。很多是由帮助 PHP 运行的
Shell 提供的,并且区其他系统很可能运行着不一致序列的Shell,所以不可以有一份确定的列表。请查看你的 Shell
文档来获取定义的环境变量列表。其余环境变量包涵了 CGI 变量,而随便 PHP
是以服务器模块仍旧 CGI 处理器的格局运行。

$_COOKIE:通过 HTTP Cookies
方式传送给当下剧本的变量的数组。setcookie() – Send a cookie

$php_errormsg — 前一个错误音信;$php_errormsg 变量包罗由
PHP
生成的风靡错误音信。那几个变量只在错误暴发的职能域内可用,并且需求 track_errors 配置项是开启的(默许是倒闭的)。假设用户定义了错误处理句柄(set_error_handler())并且再次来到 FALSE 的时候,$php_errormsg 就会被装置。

<?php@strpos();echo $php_errormsg;    //Wrong parameter count for strpos()?>

$HTTP_RAW_POST_DATA — 原生POST数据。$HTTP_RAW_POST_DATA 包罗POST
提交的原始数据。参见 always_populate_raw_post_data一般而言,使用 php://input代替 $HTTP_RAW_POST_DATA。

$http_response_header — HTTP
响应头:$http_response_header数组与 get_headers() 函数类似。当使用HTTP
包装器时,$http_response_header 将会被 HTTP
响应头音信填写。$http_response_header 将被创建于部分成效域中。

<?phpfunction get_contents() {    file_get_contents("http://example.com");    var_dump($http_response_header);}get_contents();var_dump($http_response_header);?>

$argc —
传递给脚本的参数数目:包蕴当运行于命令行下时传递给当下剧本的参数的多寡。脚本的文书名总是作为参数传递给当下剧本,因而 $argc 的最小值为 1。这么些变量仅在 register_argc_argv 打开时可用。

$argv — 传递给脚本的参数数组:包涵当运行于命令行下时传递给当下剧本的参数的数组。第二个参数总是当前剧本的文书名,因此 $argv[0] 就是本子文件名。那个变量仅在 register_argc_argv 打开时可用。

  • getopt() –
    从命令行参数列表中收获选项

15.预订义相当

Exception是富有特其他基类。类摘要:

Exception {

    /* 属性 */

    protectedstring$message ;

    protectedint$code ;

    protectedstring$file ;

    protectedint$line ;

    /* 方法 */

   
public__construct ([ string$message = “” [, int$code =
0 [, Exception$previous = NULL ]]] )

   
finalpublicstringgetMessage ( void )

   
finalpublicExceptiongetPrevious ( void )

   
finalpublicintgetCode ( void )

   
finalpublicstringgetFile ( void )

   
finalpublicintgetLine ( void )

   
finalpublicarraygetTrace ( void )

   
finalpublicstringgetTraceAsString ( void )

   
publicstring__toString ( void )

   
finalprivatevoid__clone ( void )

}

特性:message:非常音讯内容;code:万分代码;file:抛出特其他文本名;line:抛出越发在该公文中的行号

Exception::__construct — 十分构造函数

参数:message:抛出的百般音讯内容。code:至极代码。previous:非常链中的前一个老大。

Exception::getMessage — 获取至极新闻内容

参数:此函数没有参数。

Exception::getPrevious — 再次回到很是链中的前一个相当

参数:Exception::getPrevious — 再次回到非常链中的前一个非凡。追踪至极,并循环打印。

<?phpclass MyCustomException extends Exception {}function doStuff() {    try {        throw new InvalidArgumentException("You are doing it wrong!", 112);    } catch(Exception $e) {        throw new MyCustomException("Something happend", 911, $e);        }}try {    doStuff();        } catch(Exception $e) {        do {        printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e-                    >getCode(), get_class($e));        } while($e = $e->getPrevious());    }?>

以上例程的输出接近于:

/home/bjori/ex.php:8 Something happend (911) [MyCustomException]
/home/bjori/ex.php:6 You are doing it wrong! (112) [InvalidArgumentException]

Exception::getCode — 获取极度代码

参数:此函数没有参数。

Exception::getFile — 获取爆发特其他次第文件名称

参数:此函数没有参数。

Exception::getLine — 获取发生特其他代码在文件中的行号

参数:此函数没有参数。

Exception::getTrace — 获取极度追踪新闻

参数:此函数没有参数。

Exception::getTraceAsString — 获取字符串类型的分外追踪新闻

参数:此函数没有参数。

Exception::__toString — 将非凡对象转换为字符串

参数:此函数没有参数。

Exception::__clone — 极度克隆

参数:此函数没有参数。没有重临值,万分被不容许克隆。

ErrorException::__construct — 万分构造函数

参数:message:抛出的不胜音讯内容。code:极度代码。severity:很是的严重级别。filename:抛出十分所在的文本名。lineno:抛出尤其所在的行号。previous:非常链中的前一个不胜。

ErrorException::getSeverity — 获取非凡的不得了程度

参数:此函数没有参数。

<?phptry {    throw new ErrorException("Exception message", 0, 75);} catch(ErrorException $e) {    echo "This exception severity is: " . $e->getSeverity();}?>

16.预概念接口

Traversable(遍历)接口:

检测一个类是不是可以运用 foreach 进行遍历的接口。无法被单独落成的宗旨抽象接口。相反它必须由 IteratorAggregate 或 Iterator 接口完毕。达成此接口的内建类可以应用 foreach 进行遍历而无需兑现 IteratorAggregate 或 Iterator 接口。那是一个不可以在
PHP
脚本中贯彻的中间引擎接口。IteratorAggregate 或 Iterator 接口可以用来替代它。

Traversable { }  
 这几个接口没有其他措施,它的功用只是是作为所有可遍历类的为主接口。

Iterator(迭代器)接口:

可在中间迭代自己的外部迭代器或类的接口。

IteratorextendsTraversable {

    /* 方法 */

   
abstractpublicmixedcurrent ( void )

   
abstractpublicscalarkey ( void )

   
abstractpublicvoidnext ( void )

   
abstractpublicvoidrewind ( void )

   
abstractpublicbooleanvalid ( void )

}

Iterator::current — 重返当前因素:没有参数,可重回任何类型。

Iterator::key — 再次来到当前因素的键:没有参数,成功再次来到标量,失利则赶回null。

Iterator::next — 向前移动到下一个元素:没有参数,任何重返都将被忽视。此方法在 foreach 循环之后被调用。

Iterator::rewind — 重临到迭代器的首先个因素:当开头一个 foreach 循环时,那是第一个被调用的方法。它将会在 foreach 循环之后被调用。没有参数,任何重返都将被忽略。

Iterator::valid — 检查当前岗位是否可行:此措施在 Iterator::rewind() 和 Iterator::next() 方法之后被调用以此用来检查当前任务是或不是有效。没有参数,再次回到将被撤换为布尔型。成功时重临 TRUE
或者在挫折时重返 FALSE

IteratorAggregate::getIterator — 获取一个表面迭代器:没有参数,完成了 Iterator 或 Traversable 接口的类的一个实例。

ArrayAccess(数组式访问)接口:

提供像访问数组一样访问对象的能力的接口。

ArrayAccess {

    /* 方法 */

   
abstractpublicbooleanoffsetExists ( mixed$offset )

   
abstractpublicmixedoffsetGet ( mixed$offset )

   
abstractpublicvoidoffsetSet ( mixed$offset , mixed$value )

   
abstractpublicvoidoffsetUnset ( mixed$offset )

}

ArrayAccess::offsetExists — 检查一个偏移地方是或不是存在:对一个已毕了 ArrayAccess 接口的对象使用 isset() 或 empty() 时,此方法将执行。当使用 empty() 并且仅当 ArrayAccess::offsetExists() 返回 TRUE 时,ArrayAccess::offsetGet() 将被调用以检讨是为否空。参数:offset 必要检查的晃动位置。成功时重返 TRUE
或者在败北时重回 FALSE。即便一个非布尔型重临值被重回,将被撤换为布尔型。

<?phpclass obj implements arrayaccess {    public function offsetSet($offset, $value) {        var_dump(__METHOD__);}public function offsetExists($var) {    var_dump(__METHOD__);    if ($var == "foobar") {        return true;    }    return false;}public function offsetUnset($var) {    var_dump(__METHOD__);    }public function offsetGet($var) {    var_dump(__METHOD__);    return "value";    }}$obj = new obj;echo "Runs obj::offsetExists()\n";var_dump(isset($obj["foobar"]));echo "\nRuns obj::offsetExists() and obj::offsetGet()\n";var_dump(empty($obj["foobar"]));echo "\nRuns obj::offsetExists(), *not* obj:offsetGet() as there is nothing to get\n";var_dump(empty($obj["foobaz"]));?>

如上例程的输出接近于:

Runs obj::offsetExists()
string(17) "obj::offsetExists"
bool(true)

Runs obj::offsetExists() and obj::offsetGet()
string(17) "obj::offsetExists"
string(14) "obj::offsetGet"
bool(false)

Runs obj::offsetExists(), *not* obj:offsetGet() as there is nothing to get
string(17) "obj::offsetExists"
bool(true)

ArrayAccess::offsetGet — 获取一个偏移地方的值:当检查一个偏移地点是还是不是为 empty() 时,此办法被执行。

参数:offset
须要取得的撼动地点。重回值:可回到任何项目。

ArrayAccess::offsetSet — 设置一个偏移地点的值:参数:offset 待设置的舞狮地点。value 须求安装的值。没有再次来到值。

万一另一个值不可用,那么 offset 参数将被设置为 NULL。

 

ArrayAccess::offsetUnset — 复位一个偏移地点的值:当使用 (unset) 举办类型转换时,该格局不会被调用。

参数:offset待复位的晃动地点。没有重回值。

 

体系化接口:

 

Serializable::serialize — 对象的字符串表示。这么些艺术担当着对象析构器的角色。在此方式之后,__destruct() 方法将不会被调用。此函数没有参数,重回值:再次回到对象的字符串表示仍旧 NULL 。

Serializable::unserialize — 构造对象。那个艺术担当着对象构造器的角色。在此方式之后,__construct() 将不会被调用。参数:serialized 对象的字符串表示。

Closure::__construct — 用于禁止实例化的构造函数。这一个措施仅用于禁止实例化一个 Closure 类的靶子。那个类的对象的创设方法写在 匿名函数 页。此函数没有参数,没有重返值。

Closure::bind — 复制一个闭包,绑定指定的$this对象和类功能域。这些措施是 Closure::bindTo() 的静态版本。

 

 

参数:closure 必要绑定的匿名函数。newthis 须求绑定到匿名函数的目的,或者 NULL 创立未绑定的闭包。newscope 想要绑定给闭包的类效用域,或者
‘static’ 表示不改动。假使传入一个对象,则使用这一个目标的档次名。
类功用域用来控制在闭包中 $this 对象的 私有、敬重方法
的可知性。再次回到一个新的 Closure 对象 或者在挫折时再次来到 FALSE

 

 

<?phpclass A {    private static $sfoo = 1;    private $ifoo = 2;}$cl1 = static function() {    return A::$sfoo;};$cl2 = function() {    return $this->ifoo;};$bcl1 = Closure::bind($cl1, null, 'A');$bcl2 = Closure::bind($cl2, new A(), 'A');echo $bcl1(), "\n";    //1echo $bcl2(), "\n";    //2?>

Closure::bindTo — 复制当前闭包对象,绑定指定的$this对象和类效用域。创建并回到一个 匿名函数,
它与近年来目的的函数体相同、绑定了一如既往变量,但可以绑定差别的目的,也得以绑定新的类功用域。”绑定的靶子”决定了函数体中的 $this的取值,”类功用域”代表一个门类、决定在那几个匿名函数中可见调用哪些
私有 和 爱惜 的方法。 也就是说,此时 $this
可以调用的法子,与 newscope 类的分子函数是如出一辙的。静态闭包不可以有绑定的靶子( newthis 参数的值应该设为 NULL)然则如故可以用
bubdTo
方法来改变它们的类功效域。倘使你只是想要复制一个匿名函数,可以用 cloning 代替。

参数:newthis 绑定给匿名函数的一个对象,或者 NULL 来裁撤绑定。newscope 关联到匿名函数的类功效域,或者
‘static’
保持近来事态。即使是一个对象,则采纳那些目标的类型为心得类功用域。
那会控制绑定的目的的 爱护、私有成员
方法的可知性。重返值:再次回到新创制的 Closure 对象
或者在战败时重回 FALSE

 

 

<?phpclass A {    function __construct($val) {        $this->val = $val;    }    function getClosure() {        //returns closure bound to this object and scope        return function() { return $this->val; };    }}$ob1 = new A(1);$ob2 = new A(2);$cl = $ob1->getClosure();echo $cl(), "\n";    //1$cl = $cl->bindTo($ob2);echo $cl(), "\n";    //2?>

17.上下文选项和参数

 

 

套接字上下文选项可用于拥有工作在套接字上的包装协议,像 tcphttp 和 ftp.

<?php// connect to the internet using the '192.168.0.100' IP$opts = array(    'socket' => array(    'bindto' => '192.168.0.100:0',    ),);// connect to the internet using the '192.168.0.100' IP and port '7000'$opts = array(    'socket' => array(    'bindto' => '192.168.0.100:7000',    ),);// connect to the internet using port '7000'$opts = array(    'socket' => array(    'bindto' => '0:7000',    ),);// create the context...$context = stream_context_create($opts);// ...and use it to fetch the dataecho file_get_contents('http://www.example.com', false, $context);?>

HTTP context 选项 — HTTP context
的选项列表。提必要 http:// 和 https:// 传输磋商的 context 选项。
transports.可选项:

methodstring 远程服务器帮衬的 GETPOST 或其他HTTP 方法。默许值是 GET

headerstring 请求时期发送的附加 header
。在此选项的值将覆盖任何值
(诸如 User-agent:, Host: 和 Authentication:)。

user_agentstring 要发送的
header User-Agent: 的值。假诺在地方的 header context 选项中没有点名
user-agent,此值将被选取。默许使用 php.ini中装置的 user_agent。

contentstring 在 header
前边要发送的附加数据。平时采用POST或PUT请求。

proxystring URI
指定的代理服务器的地址。(e.g. tcp://proxy.example.com:5100).

request_fulluriboolean 当设置为 TRUE 时,在营造请求时将动用一切
URI 。(i.e. GET HTTP/1.0)。
纵然那是一个非标准的哀求格式,但某些代理服务器须要它。默许值是 FALSE.

follow_locationinteger 跟随 Location header
的重定向。设置为 0 以禁用。默许值是 1

max_redirectsinteger 跟随重定向的最大次数。值为 1 或更少则意味不跟随重定向。默许值是 20

protocol_versionfloat HTTP
协议版本。默许值是 1.0。PHP 5.3.0 在此从前的版本没有落到实处分片传输解码。
借使此值设置为 1.1 ,与 1.1 的格外将是您的义务。

timeoutfloat 读取超时时间,单位为秒(s),用 float 指定(e.g. 10.5)。默许使用 php.ini 中设置的 default_socket_timeout。

ignore_errorsboolean 即使是故障状态码照旧收获内容。默许值为 FALSE.

 

FTP context options — FTP context option
listing

SSL 上下文选项 — SSL
前后文选项清单。ssl:// 和 tls://传输协议上下文选项清单。可挑选:好多。

CURL context options — CURL
上下文选项列表。CURL
上下文选项在 CURL 扩充被编译(通过 –with-curlwrappers configure选项)时可用。可选项:

methodstring GETPOST,或者其余中长途服务器支持的
HTTP 方法。默认为 GET.

headerstring 额外的伸手标头。那么些值会覆盖通过任何选项设定的值(如: User-agent:Host:
Authentication:)。

user_agentstring 设置请求时 User-Agent
标头的值。默许为 php.ini 中的 user_agent设定。

contentstring 在头顶之后发送的附加数据。这几个选项在 GET 和 HEAD伸手中不行使。

proxystring URI,用于指定代理服务器的地方(例如 tcp://proxy.example.com:5100)。

max_redirectsinteger 最大重定向次数。1 或者更小则代表不会跟随重定向。默许为 20.

curl_verify_ssl_hostboolean校验服务器。默许为 FALSE。以此选项在
HTTP 和 FTP 协议中均可使用。

curl_verify_ssl_peerboolean 必要对利用的SSL证书举办校验。默许为 FALSE。那么些选项在
HTTP 和 FTP 协议中均可应用。获取一个页面,并以POST发送数据:

 

<?php$postdata = http_build_query(    array(        'var1' => 'some content',        'var2' => 'doh'        ));$opts = array('http' =>    array(        'method' => 'POST',        'header' => 'Content-type: application/x-www-form-urlencoded',        'content' => $postdata        ));$context = stream_context_create($opts);$result = file_get_contents('http://example.com/submit.php', false, $context);?>

Phar 上下文(context)选项 — Phar
上下文(context)选项列表。phar:// 封装(wrapper)的上下文(context)选项。可挑选:compressint Phar
compression constants 中的一个。metadatamixed Phar
元数据(metadata)。查看 Phar::setMetadata()。

Context 参数 — Context
参数列表。这几个参数(parameters)能够安装为由函数 stream_context_set_params() 返回的 context。参数:notificationcallable 当一个流(stream)上爆发事件时,callable 将被调用。

18.支撑的协商和包裹协议

 

 

file:// — 访问当地文件系统。文件系统 是 PHP
使用的默许封装协议,展现了本地文件系统。
当指定了一个相对路径(不以/、\、\\或 Windows
盘符先导的门径)提供的门径将基于当前的办事目录。
在众多状态下是本子所在的目录,除非被涂改了。 使用 CLI
的时候,目录默许是本子被调用时所在的目录。

在一些函数里,例如 fopen() 和 file_get_contents(), include_path 会可选地查找,也当作相对的门道。

 

 

封装协议概要
属性 支持
受 allow_url_fopen 影响 No
允许读取 Yes
允许写入 Yes
允许添加 Yes
允许同时读和写 Yes
支持 stat() Yes
支持 unlink() Yes
支持 rename() Yes
支持 mkdir() Yes
支持 rmdir() Yes

http:// — https:// — 访问 HTTP(s)
网址。允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。   HTTP
呼吁会有意无意一个 Host: 头,用于包容基于域名的虚拟主机。
借使在您的 php.ini 文件中或字节流上下文(context)配置了 user_agent 字符串,它也会被含有在呼吁之中。数据流允许读取资源的 body,而
headers 则储存在了 $http_response_header 变量里。

若是需求领会文档资源来源哪个
URL(经过所有重定向的处理后),
必要处理数据流重返的不可计数响应报头(response headers)。

 

封装协议概要
属性 支持
受 allow_url_fopen 限制 Yes
允许读取 Yes
允许写入 No
允许添加 No
允许同时读和写 N/A
支持 stat() No
支持 unlink() No
支持 rename() No
支持 mkdir() No
支持 rmdir() No

ftp:// — ftps:// — 访问 FTP(s)
URLs。允许通过 FTP 读取存在的文本,以及开立异文件。
即使服务器不协理被动(passive)方式的 FTP,连接会失利。

开拓文件后你既可以读也足以写,可是无法同时开展。
当远程文件已经存在于 ftp 服务器上,若是尝试打开并写入文件的时候,
未指定上下文(context)选项 overwrite,连接会战败。 要是要由此 FTP
覆盖存在的公文, 指定上下文(context)的 overwrite 选项来打开、写入。
其它可选择 FTP 增添来取代。即便你设置了 php.ini 中的 from 指令,
那个值会作为匿名(anonymous)ftp 的密码。

 

封装协议概要
属性 PHP 4 PHP 5
受 allow_url_fopen 影响 Yes Yes
允许读取 Yes Yes
允许写入 Yes (仅支持新文件) Yes (新文件/启用 overwrite 后已存在的文件)
允许添加 No Yes
允许同时读和写 No No
支持 stat() No 自 5.0.0 起:仅仅 filesize()、 filetype()、 file_exists()、 is_file() 和 is_dir()。 自 PHP 5.1.0 起: filemtime()。
支持 unlink() No Yes
支持 rename() No Yes
支持 mkdir() No Yes
支持 rmdir() No Yes

php:// — 访问各种输入/输出流(I/O
streams)。PHP 提供了有些杂项输入/输出(IO)流,允许访问 PHP
的输入输出流、标准输入输出和谬误描述符,
内存中、磁盘备份的临时文件流以及可以操作其余读取写入文件资源的过滤器。

php://stdin、php://stdout 和 php://stderr 允许直接访问
PHP 进程相应的输入或者输出流。
数据流引用了复制的文书描述符,所以假使您打开 php://stdin 并在今后关了它,
仅是关门了复制品,真正被引述的 STDIN 并不受影响。 注意 PHP
在那地方的作为有很多 BUG 直到 PHP 5.2.1。
推荐你简单利用常量 STDIN、 STDOUT 和 STDERR 来代替手工打开这几个封装器。

php://stdin 是只读的, php://stdout 和 php://stderr 是只写的。

php://input 是个能够访问请求的本来面目数据的只读流。
POST
请求的意况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不借助于于特定的 php.ini 指令。
而且,这样的景观下 $HTTP_RAW_POST_DATA 默许没有填写, 比激活
always_populate_raw_post_data潜在内需更少的内存。 enctype=”multipart/form-data” 的时候 php://input 是行不通的。

php://output 是一个只写的数据流,
允许你以 print 和 echo 一样的法门 写入到输出缓冲区。

php://fd 允许直接访问指定的公文讲述符。
例如 php://fd/3 引用了文本讲述符 3。

php://memory 和 php://temp 是一个好像文件
包装器的数据流,允许读写临时数据。
两者的唯一分裂是 php://memory 总是把多少储存在内存中,
而 php://temp 会在内存量达到预约义的限定后(默许是 2MB)存入临时文件中。
临时文件地方的操纵和 sys_get_temp_dir() 的方法同样。php://temp 的内存限制可经过添加 /maxmemory:NN来控制,NN 是以字节为单位、保留在内存的最大数据量,超越则利用临时文件。

php://filter 是一种元封装器,
设计用来数据流打开时的筛选过滤应用。
那对于一体式(all-in-one)的文本函数相当有用,类似 readfile()、 file() 和 file_get_contents(),
在数据流内容读取此前从未机会采用其他过滤器。php://filter 目的使用以下的参数作为它路径的一片段。
复合过滤链可以在一个路线上点名。

封装协议摘要(针对 php://filter,参考被筛选的封装器。)
属性 支持
首先于 allow_url_fopen No
首先于 allow_url_include 仅 php://input、 php://stdin、 php://memory 和 php://temp
允许读取 仅 php://stdin、 php://input、 php://fd、 php://memory 和 php://temp
允许写入 仅 php://stdout、 php://stderr、 php://output、 php://fd、 php://memory 和php://temp
允许追加 仅 php://stdout、 php://stderr、 php://output、 php://fd、 php://memory 和php://temp(等于写入)
允许同时读写 仅 php://fd、 php://memory 和 php://temp
支持 stat() 仅 php://memory 和 php://temp
支持 unlink() No
支持 rename() No
支持 mkdir() No
支持 rmdir() No
仅仅支持 stream_select() php://stdin、 php://stdout、 php://stderr、 php://fd 和 php://temp

zlib:// — bzip2:// — zip:// — 压缩流。zlib: PHP
4.0.4 – PHP 4.2.3(仅协助带 fopencookie 的系统)

compress.zlib:// 和 compress.bzip2:// PHP
4.3.0 及以上

zlib: 的功能相近 gzopen(),不过其数据流仍能被 fread() 和其余文件系统函数使用。 自 PHP 4.3.0
后那个不提出被选拔,因为会和其余带”:”字符的文本名混淆;
请使用 compress.zlib:// 作为替代。

compress.zlib://、 compress.bzip2://和
gzopen()、bzopen()是相等的。并且可以在不辅助 fopencookie
的连串中应用。

ZIP 扩张注册了 zip: 封装协议。可选拔

  • compress.zlib://file.gz
  • compress.bzip2://file.bz2
  • zip://archive.zip#dir/file.txt

data:// — 数据(RFC
2397)。用法:data://text/plain;base64,

封装协议摘要
属性 支持
受限于 allow_url_fopen No
受限于 allow_url_include Yes
允许读取 Yes
允许写入 No
允许追加 No
允许同时读写 No
支持 stat() No
支持 unlink() No
支持 rename() No
支持 mkdir() No
支持 rmdir() No

打印 data:// 的内容:

<?php// 打印 "I love PHP"echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo=');?>

收获媒体类型:

<?php$fp = fopen('data://text/plain;base64,', 'r');$meta = stream_get_meta_data($fp);echo $meta['mediatype'];    // 打印 "text/plain"?>

glob:// — 查找匹配的文本路径格局。用法:glob://

封装协议摘要
属性 支持
受限于 allow_url_fopen No
受限于 allow_url_include No
允许读取 No
允许写入 No
允许附加 No
允许同时读写 No
支持 stat() No
支持 unlink() No
支持 rename() No
支持 mkdir() No
支持 rmdir() No

<?php// 循环 ext/spl/examples/ 目录里所有 *.php 文件// 并打印文件名和文件尺寸$it = new DirectoryIterator("glob://ext/spl/examples/*.php");foreach($it as $f) {    printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024);    }?>

tree.php: 1.0K
findregex.php: 0.6K
findfile.php: 0.7K
dba_dump.php: 0.9K
nocvsdir.php: 1.1K
phar_from_dir.php: 1.0K
ini_groups.php: 0.9K
directorytree.php: 0.9K
dba_array.php: 1.1K
class_tree.php: 1.8K

phar:// — PHP 归档。用法:phar://

封装协议摘要
属性 支持
支持 allow_url_fopen No
支持 allow_url_include No
允许读取 Yes
允许写入 Yes
允许附加 No
允许同时读写 Yes
支持 stat() Yes
支持 unlink() Yes
支持 rename() Yes
支持 mkdir() Yes
支持 rmdir() Yes

ssh2:// — Secure Shell 2。

rar:// — RAR。

 

ogg:// — 音频流。

expect:// — 处理交互式的流。

=================================================================================================

 

安全!!!

处理files、Date、Directory、GD库、等用的停放函数

本身本人用的不是多多益善,前些天在此地暂时并未资格说太多,须要话提出看看PHP官方手册呢,操作数据库的松开函数在此间也不说啊。

本人还会用到收获唯一的字符串用来做图片文件名等

//确保文件名唯一,防止重名产生覆盖
- $uniName = md5(uniqid(microtime(true),true)).'.'.$ext;
- $uniName = uniqid(rand(0,time())).'.'.$ext;

  private function createCheckCode(){
  //这里主要产生随机码,从2开始是为了区分1和l
  $code="23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKMNPQRSTUVWXYZ";
  $string='';
  for($i=0; $i < $this->codeNum; $i++){
  $char=$code{rand(0, strlen($code)-1)};
  $string.=$char;
  }
  return $string;
  }

number

number说澳优(Beingmate)个参数可以是unteger或float。

获得PHP所有内置函数

echo "<pre>";
print_r(get_defined_functions());

以上内容都很愚钝和精炼,在接下去我会在那里一而再商讨PHP魔力。

callback

稍加诸如call_user_function( )或usort(
)的函数接受用户自定义的函数作为一个参数。Callback函数不仅可以是一个简短的函数,它还足以是一个对象的法门,蕴含静态类的法门。
一个PHP函数用函数名字来传递。可以传递任何内置的依旧用户自定义的函数,除了语言结构如array(
), echo( ), empty( ), eval( ), exit( ), isset( ), list( ), print(
)和unset( )。
一个目的的形式以数组的样式来传递,数组的下标0指明对象名,下标1指明方法名。
对于从未实例化为目的的静态类,要传送其格局,将数组0下标指明的对象名换成该类的名目即可。
除了常见的用户定义的函数外,也得以使用create_function(
)来创建一个匿名的回调函数(callback)。

注明

自己较熟习TP框架,接触过小品种一二三啊,掌握不是很对,因为不知晓的太多。由于自家水平有限,所有错误恳请各位更正。

Example #1 回调函数(callback)示例

<?php
//普通的回调函数
function my_callback_function(){
  echo 'hello world!';
}

//回调方法
function MyClass{
  static function myCallbackMethod(){
     echo 'Hello World!';
  }
}

//Type 1: Simple callback
call_user_func('my_callback_function');

//Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod'));

//Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

//Type 4: Static class method call (As of PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');

//Type 5: Realtive static class method call(As of PHP 5.3.0)
class A{
  public static function who(){
     echo "A";
  }
}

class B extends A{
  public static function who(){
        echo "B";
   }
}

call_user_func(array('B', 'parent::who'));  //A
?>

Note:

在 PHP4
中,必须利用引用来创建一个针对实际object,而不是它的一个拷贝。详情请见引用的表明。
In PHP4, it was necessary to use a reference to create a callback that
points to the actual object, and not a copy of it. For more details, see
References Explained.

void

void作为再次回到类型意味着函数的重回值是低效的。void作为参数列表意味着函数不接受其余参数。

在函数原型中,$…表示等等的趣味。当一个函数可以承受任意个参数时采纳此变量名。

PHP类型转换的辨认
PHP在变量定义中不要求(或不帮助)明确的类型定义;变量类型是依据使用该变量的上下文说决定的。也就是说,如果把一个字符串值赋给变量var,var就成了一个字符串。要是又把一个整型值赋给var,那它就成了一个整数。
PHP的机动类型转换的一个事例是号”+”。假诺此外一个操作数是浮点数,则怀有的操作数都被当成浮点数,结果也是浮点数。否则操作数会被解说为整数,结果也是整数注意那并不曾更改那一个操作数本身的档次;改变的仅是那么些操作数怎样被求值以及表达式本身的连串。

<?php
$foo = "0";  // $foo 是字符串 (ASCII 48)
$foo += 2;   // $foo 现在是一个整数 (2)
$foo = $foo + 1.3;  // $foo 现在是一个浮点数 (3.3)
$foo = 5 + "10 Little Piggies"; // $foo 是整数 (15)
$foo = 5 + "10 Small Pigs";     // $foo 是整数 (15)
?>

项目强制转换

PHP中的类型强制转换和C中的格外像:在要转换的变量以前拉长用括号括起来的靶子项目。

<?php
$foo = 10;   // $foo is an integer
$bar = (boolean) $foo;   // $bar is a boolean
?>

允许的强制转换有:
+(int), (integer) – 转换为 整型(integer)
+(bool), (boolean) – 转换为 布尔型(boolean)
+(float),(double),(real) – 转换为浮点型(float)
+(string) – 转换为字符串(string)
+(binary) – 转换为二进制字符串(string)(PHP 6)
+(array) – 转换为数组(array)
+(object) – 转换为对象(object)
+(unset) – 转换为NULL(PHP 5)

(binary)转换会在结果眼前加上前缀’b’,PHP 5.2.1猛增。

小心在括号内允许有空格和制表符,所以上边八个例证的意义雷同:

<?php
$foo = (int) $bar;
$foo = (int) $bar;
?>

将字符串(string)文字和变量转换为二进制字符串(string):

<?php
$binary = (binary)$string;
$binary = b"binary stirng";
?>

Note:

可以将变量放置在双引号的办法来替代将变量转换成字符串(string):

<?php
$foo = 10;  //$foo是一个整数
$str = "$foo";  //$str是一个字符串
$fst = (string)$foo;  //$fst也是一个字符串

//输出"they are the same"
if($fst == $str){
   echo "they are the same";
}
?>

有时在档次之间强制转换时方便的会暴发怎么样或者不是很明确。

Leave a Comment.