菜单

【javascript/PHP】当一个JavaScripter初次进入PHP的世界,他将看到那般的青山绿水

2019年1月29日 - 金沙编程资讯
<?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);

转换到NULL

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

11.老大处理

思路2:[变量
instanceof 类型] 能分别检测出array,普通object和function

1.PHP中的数组实际上是平稳映射,可以算作数组,列表,散列表,字典,集合,栈,队列,不是固定的长度
2.数组概念中三个单元都使用了同一个键名,则只使用了最后一个,从前的都被掩盖了
3.想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前边加上记号
&
4.PHP
的引用是别名,就是三个例外的变量名字指向相同的内容;“默许意况下对象是经过引用传递的”。但实则那不是完全正确的,当对象作为参数传递,作为结果回到,或者赋值给别的一个变量,其它一个变量跟原来的不是引用的关联,只是他俩都保留着同一个标识符的正片

PHP本文档中应用的伪类型

生成器允许你在 foreach代码块中写代码来迭代一组数据而不要求在内存中开创一个数组,
那会使你的内存达到上限,或者会占用可观的拍卖时间。相反,你可以写一个生成器函数,就如一个日常的自定义函数一样,
和平常函数只回去一遍分裂的是,
生成器可以根据要求 yield 很多次,以便生成须求迭代的值。

图片 1

  

实用函数

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
        class class_test{
           var $value = '我是变量';
           public function fuc(){
               echo '我是方法';
           }
         }
        $obj = new class_test();
        $array_test = [1,2,3];
        $string_test = '字符串';
        $int_test = 1;
        $float_test = 1.2;
        var_dump($obj);//检测对象
        echo "<br/>";
        var_dump($array_test);//检测数组
        echo "<br/>";
        var_dump($string_test);//检测字符串
        echo "<br/>";
        var_dump($int_test);//检测整型
        echo "<br/>";
        var_dump($float_test);//检测浮点型
        echo "<br/>"; 
?>

PHP NULL

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

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

Comparing generators with Iterator objects

The primary advantage of generators is their simplicity. Much less
boilerplate code has to be written compared to implementing
anIterator 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?>

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

以下内容可以经过引用传递:

变量,例如 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
 声喜宝(Hipp)个变量时实际上确立了一个到全局变量的引用。也就是说和这么做是一律的:

<?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/库克ie 变量导入到全局效用域中;session_start() –
启动新会话或者重用现有会话;getenv() – 获取一个环境变量的值;

$_ENV:通过环境艺术传递给当下剧本的变量的数组。那几个变量被从
PHP 解析器的运行条件导入到 PHP 的全局命名空间。很多是由辅助 PHP 运行的
Shell 提供的,并且差距的连串很可能运行着差距门类的
Shell,所以不可以有一份确定的列表。请查看你的 Shell
文档来获取定义的环境变量列表。其余环境变量包括了 CGI 变量,而任由 PHP
是以服务器模块仍旧 CGI 处理器的措施运行。

$_主任KIE:通过 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 打开时可用。

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: 封装协议。可选择

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:// — 处理交互式的流。

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

 

安全!!!

 

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";
}
?>

偶然在项目之间强制转换时非凡的会时有暴发哪些或者不是很明朗。

图片 2 

void

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

12.生成器

1.echo(注意那TM可能是个坑):只可以打印标量:数字,字符串或布尔值,打印object或Array会报错,而且打印布尔值的时候true打印1,false时候怎么也不打印

callback

些微诸如call_user_function( )或usort(
)的函数接受用户自定义的函数作为一个参数。Callback函数不仅可以是一个简易的函数,它仍能是一个对象的法子,包罗静态类的法子。
一个PHP函数用函数名字来传递。可以传递任何内置的要么用户自定义的函数,除了语言结构如array(
), echo( ), empty( ), eval( ), exit( ), isset( ), list( ), print(
)和unset( )。
一个对象的点子以数组的款式来传递,数组的下标0指明对象名,下标1指明方法名。
对于从未实例化为目的的静态类,要传送其方式,将数组0下标指明的对象名换成该类的名称即可。
除了一般的用户定义的函数外,也可以应用create_function(
)来创立一个匿名的回调函数(callback)。

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

 

number

number说雀巢(Nestle)个参数可以是unteger或float。

用户可以用自定义的不行处理类来伸张 PHP
内置的不行处理类。以下的代码表达了在置放的不得了处理类中,哪些属性和措施在子类中是可访问和可一而再的。译者注:以下那段代码只为表明内置极度处理类的结构,它并不是一段有实际意义的可用代码。

【注意】在PHP中运用变量和常量的不一致在于变量在急需在前面加$,常量不要求

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

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

$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(); // 可输出的字符串}?>

图片 3

PHP资源类型

资源是一种新鲜变量,保存了到表面资源的一个引用。资源是因此专门的函数来确立和使用的。
Note:资源类型是PHP4引进的。

伸张 PHP 内置的要命处理类

5.关于var——在PHP中,你大约可以淡忘var了

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.

<?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 ";}?>

图片 4

mixed

mixed表达一(Wissu)个参数可以接受所有的PHP类型,str_replace()可以接受字符串和数组。

 图片 5

概念数组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);
?>

<?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";?>

<?php
        echo $bless;//提前输出变量
        send_bless();//提前调用函数
         $bless = '鸡年大吉';//定义变量
        function send_bless(){//通过声明方式定义函数
           echo '祝你鸡年大吉吧'."<br/>";
        }
?>

Warning

自PHP4.3.0起,上述的索引生成方法改变了。近日如若给一个当下最大键名是负值的数组添加一个新值,则新生成的目录将为(0)。之前新生成的目录为近日最大索引加一,和正在的目录相同。
行使TRUE作为键名将使integer1成为键名。使用FALSE作为键名将使integer0成为键名。使用NULL作为键名将等同于使用空字符串。使用空字符串作为键名将新建(或掩盖)一个用空字符串作为键名的值,那和用空的方括号分裂。
不能用数组和目的作为键(key)。那样会促成一个告诫:Illegal offset type。

1.数据类型不相同

语法

var
bless;//变量表明被升级

语法

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

<?php
$var = NULL;
?>

 

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
?>

 

PHP对象

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

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

<?php
     $array = [1,2,3];
     echo $array;
?> 

体系强制转换

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";
?>

 图片 6

PHP数组

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

 

在函数原型中,$…代表等等的情趣。当一个函数可以接受任意个参数时利用此变量名。

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)
?>

在类型检测的点子中,大家一般将艺术分成四个思路:

转移为对象

设若将一个对象转换成对象,它将不会有其他变动。若是其余任何类型的值被转换成对象,将会实例化一个内置类stdClass的对象。假使该值为NULL,则新的实例为空。数组转换成对象将使键名成为属性名并负有相对应的值。对于任何其他的值,名为scalar的成员变量将富含该值。

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

在上头的例子中,可能不难让我们形成一种错误的定义,即值传递
== 对传播变量不会有震慑,那是或不是这么呢?

<script type="text/javascript">
   var array1 =[1,2,3];
   var array2 =[1,2,3];
   console.log('两个数组是否相等?',array1 == array2);
   console.log('两个数组是否恒等?',array1 == array2);
</script>

这告诉大家,PHP里面存在函数注脚进步,而不设有变量申明升高

 

<?php
    var $word = '算法要学好';
    echo $word;
?>

 

思路2:检测变量是不是属于给定类型,(重回boolean)

对!JS是值传递,但在此地,传递的参数并不是指标,而是对象的地点(或引用)!!也就是说即便存储my_obj对象地址的变量把值传递给了函数中创设的一部分变量obj(值传递),但那二者依然指向堆内存中的同一个目的,所以上述例子中目的的值才被涂改了。

结果是怎么吧?

打印Array时报类型转换的警告,但仍能打印项目

<?php
   class Person{
      var $word ='算法要学好';
    }
   $me = new Person();
   echo $me->word;
?>

运作结果:

<script type="text/javascript">
    function addNum(value){
       return value = value +1;
     }
    var my_value = 1;
    addNum(my_value);
    console.log(my_value);
</script>

那么在PHP中应当怎么创建对象呢?——定义一个类并实例化对象

运行:

对PHP:

10.引用传递照旧值传递?

<?php
   $true_value = true;
   $false_value =false;
   echo $true_value;
   echo "<br/>";
   echo $false_value;
?>

 

 本文将从以下11点牵线javascript和PHP在基础语法和基本操作上的异议:

 

<?php
    class Person{
       var $word ='算法要学好';
       function echo_word(){
          echo '数据结构也很重要';
          }
    }
    $me = new Person();
    echo $me->word;//通过->访问对象中的成员变量
    echo "<br/>";
    echo $me->echo_word();//通过->调用对象中的方法
?>

console.log(bless);//输出一个尚且不设有的变量

运作结果:

 

6.PHP和JS在拜访对象属性时候利用的操作符不一致


js

对JS:

 

在宣称一个函数前调用那一个函数

 图片 7

 

PHP:标量类型:string,float,integer,Boolean,复合类型:object,array
极度系列:null,Resource

 

图片 8

<?php
   $obj = {name:'penghwuan'};
   var_dump($obj);
?>

思路1:gettype(变量)
能区分出任意数据类型

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图