1 关于引用的解释
在PHP中,引用可以看作是与Linux中的hardlink类似的东西,也叫别名,它与指针是不同的。不同的是PHP中的引用是可以复制的,如$a=&$b; $c=$a;
引用可以使得两个变量指向对一块内容,如$a = &$b;
引用可以传递变量,通过将一个变量传递给函数,函数就可以修改其参数的值。只有变量和new语句才能通过引用传递,对于类变量默认都是按引用传递的。
<?php function foo(&$var) { $var++; } $a=5; foo($a); // $a is 6 here ?>
函数可以返回引用。
http://write.blog.csdn.net/postedit/7703091
<?php class 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. ?>
2 预定义变量
$GLOBALS: 包含所有定义的全局变量的信息,键的key为
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目。此变量中包含以下元素:
argv 传递给脚本的参数数组,当以get方式调用时,传递的是查询串。
argc 参数个数
GATEWAY_INTERFACE 服务器使用CGI规范的版本,如CGI/1.1
SERVER_ADDR 当前运行脚本的服务器的地址
SERVER_NAME 当前运行脚本的主机名。
SERVER_SOFTWARE 服务器标识串,在响应请求时头信息中给出
SERVER_PROTOCOL 请求页面时协议名称与版本,如HTTP/1.1
REQUEST_METHOD 请求方法,如GET/HEAD/POST/PUT等
REQUEST_TIME 请求开始的时间戳
QUERY_STRING 通过页面访问时的查询字符串
DOCUMENT_ROOT 当前运行脚本所在的文档根目录
HTTP_ACCEPT 当前请求头中Accept项的内容
HTTP_ACCEPT_CHARSET 当前请求头中Accept-Charset的内容
类似的变量还有:HTTP_ACCEPT_ENCODING,HTTP_ACCEPT_LANGUAGE,HTTP_CONNECTION,HTTP_HOST,HTTP_REFERER,HTTP_USER_AGENT
HTTPS 若用户通过https访问的话,此变量非NULL
REMOTE_ADDR/HOST/PORT 浏览当前页面用户的IP地址/主机名/端口
SERVER_PORT WWW的服务端口
PATH_TRANLATED 当前脚本所在文件系统的绝对路径
SCRIPT_NAME 包含当前脚本的路径
PATH_INFO 由客户端提供的,跟在脚本名称之后且在查询语句之前的路径信息。例如:http://www.example.com/php/path_info.php/some/stuff?foo=bar 被访问,那么 $_SERVER['PATH_INFO'] 将包含 /some/stuff
REQUEST_URI 用来指定要访问的页面,即主机名后面的部分
PHP_AUTH_USER/PW PHP运行在Apache或IIS模块方式下需要用HTTP认证的用户名与密码
$_GET 通过URL传递给当前脚本的变量的数组,其已经过urldecode()处理。
$_POST 通过HTTP POST方法传递给当前脚本的变量的数组
$_FILE
$_REQUEST 默认情况下包含了$_GET $_POST和$_COOKIE的数组
$_SESSION
$_ENV 通过环境方式传递给当前脚本的变量数组
$_COOKIE 通过HTTP Cookie方式传递给当前脚本的变量的数组
$HTTP_RAW_POST_DATA 包含POST提交的原始数据
$argc 与$argv 包含当前运行于命令行下时传递给当前脚本的参数的数组
3 预定义异常
Exception是所有异常的基类,在上一篇文章中有相关的介绍。
另一个异常是ErrorException 定义了错误异常,其用于描述异常的严重程度。
5 上下文选项
PHP提供了一些便利的在各种协议应用场景下的上下文选项,以方便我们使用。
5.1 Socket上下文
bindto 以ip:port的形式提供,用于指示tcp等的连接地址
backlog 整数,表示listen的队列大小
<?php $opts = array( 'socket' => array( 'bindto' => '192.168.0.100:7000', ), ); $context = stream_context_create($opts); $content = file_get_content('http://www.example.com',false,$context); echo $content; ?>
5.2 HTTP上下文
method string
header string
user_agent string
content string
proxy string
request_fulluri bool
follow_lodateion bool
max_redirects int
protocol_version float
timeout float
ignore_errors bool
<?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); ?>
此外PHP还支持FTP,SSL,CURL等的上下文,具体可以参考文档。
6 协议封装器
PHP内置封装了多种类似URL样式的协议,都可以通过fopen() file_exists()等来访问。用户可以使用stream_wrapper_register()函数注册自定义封装器。
6.1 file://
用于访问本地文件系统,
6.2 http://
<?php $url = 'http://www.example.com/redirecting_page.php'; $fp = fopen($url, 'r'); $meta_data = stream_get_meta_data($fp); foreach ($meta_data['wrapper_data'] as $response) { /* Were we redirected? */ if (strtolower(substr($response, 0, 10)) == 'location: ') { /* update $url with where we were redirected to */ $url = substr($response, 10); } } ?>
6.3 php://
PHP提供了一些IO流以供访问PHP自己的输入和输出流,如php://stdin php://stdout php://stderr,其允许在PHP进程中直接访问各种流。流引用只是一个复本。stdin为只读,dtdout与stderr为可写的。
php://fd支持直接访问指定的文件描述符
php://memory 与php://temp 允许存储临时数据并以文件的方式访问之。
<?php $file = fopen("php://stdout","rw"); fwrite($file,"hello world\n"); ?>
此外还有其他的如ftp:// zlib:// ssh2:// rar:// ogg://等等。