语言结构:
1.什么是引用变量
demo1.php
<?php
$a = range(1,100);
var_dump(memory_get_usage());// 用这个函数验证
// cow, copy on write 只有修改这2个变量当中的一个,才进行copy(开内存)
$b = $a;
var_dump(memory_get_usage());
// 对 a 进行修改, 此时才开辟新的空间
$a = range(1,100);
var_dump(memory_get_usage());
demo2.php
<?php
$a = range(1,100);
var_dump(memory_get_usage());// 用这个函数验证
// 2个变量指向一个空间,不会开辟空间了
$b = &$a;
var_dump(memory_get_usage());
// 对 a 进行修改, 此时才开辟新的空间
$a = range(1,100);
var_dump(memory_get_usage());
demo3.php
<?php
// zval 变量容器
$a = range(0,3);
xdebug_debug_zval('a');
$b = $a;
xdebug_debug_zval('a');
// 修改 a
$a = range(0,3);
xdebug_debug_zval('a');
demo4.php
<?php
$a = range(0,3);
xdebug_debug_zval('a');
$b = &$a;
xdebug_debug_zval('a');
$a = range(0,3);
xdebug_debug_zval('a');
demo5.php
<?php
// unset 只会取消引用,不会销毁内存空间
$a = 1;
$b = &$a;
unset($b);
echo $a;
demo6.php
<?php
//对象本身就是引用传递,如果需要复制 用 clone
class Person
{
public $name = 'zhang 3';
}
$p1 = new Person();
xdebug_debug_zval('p1');
$p2 = $p1;
xdebug_debug_zval('p1');
$p2->name = 'li 4';
xdebug_debug_zval('p1');
2.常量及数据类型
$GLOBALS 包含其他所有,
$_REQUEST 包含 $_GET,$_POST,$_COOKIE
3.运算符
4.流程控制
5.自定义函数
6.正则表达式
<?php
$str = '中文';
//$pattern = '/[\x{4e00}-\x{9fa5}]+/u'; // utf-8 匹配
$pattern = '/['.chr(0xb0).'-'.chr(0xf7).']['.chr(0xa1).'-'.chr(0xfe).']/';//gb2312匹配
preg_match($pattern, $str, $match);
var_dump($match);
7.文件以及目录
<?php
// 1.打开文件
// 2.将文件的内容读取出来,在开头加入 hello world
// 3.将拼接好的字符串写回文件
$file = './hello.txt';
$handle = fopen($file, 'r');
$content = fread($handle, filesize($file));
$content = 'Hello World'.$content;
fclose($handle);
$handle = fopen($file, 'w');
fwrite($handle, $content);
fclose($handle);
遍历目录:
<?php
$dir = './test';
// 1.打开目录
// 2.读取目录中文件
// 3.如果文件类型是目录,继续打开,如果是文件,输出文件名称
// 4.读取子目录的文件
// 5.关闭目录
function loopDir($dir)
{
$handle = opendir($dir);
while ( false !== ($file = readdir($handle)) ) {
if ( $file != '.' && $file != '..' ) {
echo $file.'<br/>';
if ( filetype($dir.'/'.$file) == 'dir' ) {
loopDir($dir.'/'.$file);
}
}
}
}
loopDir($dir);
8.会话控制
cookie : 由服务器发送给客户端的片段信息,但存储在客户端浏览器的内存或者硬盘当中的技术.
优缺点:保持在客户端,不占用服务器空间。
用户有权禁用
分布式 session ,可以用 redis
9.面向对象
10.网络协议
1XX : 接收请求,正在处理
2XX : 成功状态码
3XX : 重定向,需要附加操作才能完成请求
4XX : 客户端错误,服务器无法请求
5XX : 服务器处理请求出错了
区别:
1. 做后退和刷新,get没有变化是无害的,post数据会被重新提交
2. get 可以被收藏为书签,post 不行
3. get 可以被浏览器缓存,post 不行
4. get 请求的编码类型为 application/x-www-form-urlencoded;
post 有3中。multipart/form-data, text/plain,application/x-www-form-urlencoded
二进制数据使用多重编码,如文件上传
5. get 在历史记录当中,会被保存到浏览器中,而 post 不会
6. get 有数据长度限制,url长度限制(2048), post 没有限制
7. 数据类型限制:get 只允许 ASCII 码(gb2312),post 没有限制
8. 安全性:post 比 get 安全
FTP : 21
Telnet : 23
SMTP : 25
POP3 : 110
HTTP : 80
DNS : 53
11.开发环境配置
<?php
$array1 = ["k1"=>1,"k2"=>2,"k3"=>3];
/*代码片段1*/
foreach($array1 as $k1=> &$v1)
{
$v1 = $v1+1;
}
xdebug_debug_zval('array1');
//array1: (refcount=1, is_ref=1)=array ('k1' => (refcount=1, is_ref=1)=2, 'k2' => (refcount=1, is_ref=1)=3, 'k3' => (refcount=2, is_ref=1)=4)
//其中 refcount 表示引用计数,is_ref 表示是否为引用,0 表示不是引用,1 表示是引用
xdebug_debug_zval("v1");
//v1: (refcount=2, is_ref=1)=4
/*代码片段2*/
//其实上面的 foreach 内部相当于下面的代码片段,但是实际情况会复杂很多,这里只是类比
$array2 = ["k1"=>1,"k2"=>2,"k3"=>3];
$v2 = &$array2['k1'];//声明$v2变量是$array2['k1']的reference(译作:引用)
$v2 = $v2+1;
$v2 = &$array2['k2'];
$v2 = $v2+1;
$v2 = &$array2['k3'];
$v2 = $v2+1;
xdebug_debug_zval('array2');
//array2: (refcount=1, is_ref=0)=array ('k1' => (refcount=1, is_ref=1)=2, 'k2' => (refcount=1, is_ref=1)=3, 'k3' => (refcount=2, is_ref=1)=4)
xdebug_debug_zval("v2");
//v2: (refcount=2, is_ref=1)=4
//接下来我们应该把 $v2 变量 unset 掉,避免对 $array2['k3'] 的值产生副作用
//这时发现 $v2 成了未初始化的变量
unset($v2);
xdebug_debug_zval('v2');
//v2: (refcount=0, is_ref=0)=*uninitialized*
//我们再次给 $v2 赋值发现它已经非引用变量
$v2 = 111;
xdebug_debug_zval('v2');
http://blog.csdn.net/ethan19/article/details/49252765
https://gitee.com/nodestudy/phpgod/blob/master/zh/02.2.md