1
<?php
$a = 1; /* global scope */
function Test()
{
echo $a; /* reference to local scope variable */
}
Test();
?>
这个脚本不会有任何输出,因为 echo 语句引用了一个局部版本的变量 $a,而且在这个范围内,它并没有被赋值。你可能注意到 PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖。这可能引起一些问题,有些人可能不小心就改变了一个全局变量。PHP 中全局变量在函数中使用时必须申明为global。
2在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。前面的例子可以写成:
Example #2 使用 $GLOBALS 替代 global
<?php
$a = 1;
$b = 2;
function Sum()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
Sum();
echo $b;
?>
$GLOBALS 是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。以下范例显示了超全局变量的用处:
3.
可以用 define() 函数来定义常量。在 PHP 5.3.0 以后,可以使用const 关键字在类定义的外部定义常量。一个常量一旦被定义,就不能再改变或者取消定义。
常量只能包含标量数据(boolean,integer,float 和 string)。 可以定义resource 常量,但应尽量避免,因为会造成不可预料的结果。
可以简单的通过指定其名字来取得常量的值,与变量不同,不应该在常量前面加上$ 符号。如果常量名是动态的,也可以用函数constant() 来获取常量的值。用get_defined_constants() 可以获得所有已定义的常量列表。
4.
Note: 递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是 1。
$a = NULL;
echo ++$a; // echo 1
5.
// "||" 的优先级比 "or" 高
$e = false || true; // $e 被赋值为 (false || true),结果为 true
$f = false or true; // $f 被赋值为 false [Altair注:"=" 的优先级比 "or" 高]
6.自 PHP 5 起,可以很容易地通过在$value 之前加上 & 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。
<?php
此方法仅在被遍历的数组可以被引用时才可用(例如是个变量)。
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
?><?php
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
7.
既然 return() 是语言结构而不是函数,因此其参数没有必要用括号将其括起来。通常都不用括号,实际上也应该不用,这样可以降低 PHP 的负担。
Note: 当用引用返回值时永远不要使用括号,这样行不通。只能通过引用返回变量,而不是语句的结果。如果使用return ($a); 时其实不是返回一个变量,而是表达式($a) 的值(当然,此时该值也正是$a 的值)。
8.
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为final,则不能被继承。
9.对象序列化:
所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
为了能够unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。 如果要想在另外一个文件中解序列化一个对象,这个对象的类必须在解序列化之前定义,
10.预定义变量
- 超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量
- $GLOBALS — 引用全局作用域中可用的全部变量
- $_SERVER — 服务器和执行环境信息
- $_GET — HTTP GET 变量
- $_POST — HTTP POST 变量
- $_FILES — HTTP 文件上传变量
- $_REQUEST — HTTP Request 变量
- $_SESSION — Session 变量
- $_ENV — 环境变量
- $_COOKIE — HTTP Cookies
- $php_errormsg — 前一个错误信息
- $HTTP_RAW_POST_DATA — 原生POST数据
- $http_response_header — HTTP 响应头
- $argc — 传递给脚本的参数数目
- $argv — 传递给脚本的参数数组
11.
当然,单纯地关闭 register_globals 并不代表所有的代码都安全了。对于每一段提交上来的数据,都要对其进行具体的检查。永远要验证用户数据和对变量进行初始化!把error_reporting() 设为E_NOTICE 级别可以检查未初始化的变量。
12.
隐藏php
一般而言,通过隐藏的手段提高安全性被认为是作用不大的做法。但某些情况下,尽可能的多增加一份安全性都是值得的。
一些简单的方法可以帮助隐藏 PHP,这样做可以提高攻击者发现系统弱点的难度。在 php.ini 文件里设置 expose_php = off ,可以减少他们能获得的有用信息。
另一个策略就是让 web 服务器用 PHP 解析不同扩展名。无论是通过 .htaccess 文件还是 Apache 的配置文件,都可以设置能误导攻击者的文件扩展名:
Example #1 把 PHP 隐藏为另一种语言
或者干脆彻底隐藏它:# 使PHP看上去像其它的编程语言 AddType application/x-httpd-php .asp .py .pl
Example #2 使用未知的扩展名作为 PHP 的扩展名
或者把它隐藏为 HTML 页面,这样所有的 HTML 文件都会通过 PHP 引擎,会为服务器增加一些负担:# 使 PHP 看上去像未知的文件类型 AddType application/x-httpd-php .bop .foo .133t
Example #3 用 HTML 做 PHP 的文件后缀
# 使 PHP 代码看上去像 HTML 页面 AddType application/x-httpd-php .htm .html
要让此方法生效,必须把 PHP 文件的扩展名改为以上的扩展名。这样就通过隐藏来提高了安全性,虽然防御能力很低而且有些缺点。
13.
在命令行直接运行 PHP 代码。
php -r 'print_r(get_defined_constants());' 14. header('P3P: CP="CAO PSA OUR"');
用P3P header解决iframe跨域访问cookie
15.
call_user_func —把第一个参数作为回调函数调用
mixedcall_user_func ( callable$callback
[,mixed$parameter
[,mixed$...
]] )
第一个参数 callback
是被调用的回调函数,其余参数是回调函数的参数。
16. php 模拟post提交
function curl_post($url, $post) {
$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $post,
);
$ch = curl_init($url);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
$data = curl_post("http://localhost/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));
var_dump($data);
17.有时候 页面
里使用请求返回
信息会有
{"ret_code":1,"ret_msg":"\u5bfc\u5165\u6210\u529f"}
将其中的
"\u5bfc\u5165\u6210\u529f" 放到js代码之后可以输出中文
18.mysql表结构 null default
分为下面4种情况:
1、允许null, 指定default值。
2、允许null, 不指定default,这个时候可认为default值就是null
3、不允许null,指定default值,不能指定default值为null,否者报错 Invalid default value for xxx
4、不允许null,不指定default值。这种情况,Insert的时候,必须指定值。否者报错 Field xxx doesn't have a default value
默认是非NULL比较好,理由如下:
(1)可以大大的节省存储空间,因为当某一列设为default null时,数据库需要用额外的一个字节记录每条record是否为null
(2)很多操作,如order by、group by等都会忽略值为NULL的record~
19. php namespaces are case-insensitive:
file1.php:
<?php
namespace foo;
function bar()
{
echo 'from bar';
}
?>
file2.php:
<?php
fOo\bar() // output: from bar
?>
命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。
get_defined_constants() 可以获得所有已定义的常量列表。
常量和变量有如下不同:
- 常量前面没有美元符号($);
- 常量只能用 define() 函数定义,而不能通过赋值语句;
- 常量可以不用理会变量的作用域而在任何地方定义和访问;
- 常量一旦定义就不能被重新定义或者取消定义;
- 常量的值只能是标量。
和使用 define() 来定义常量相反的是,使用 const 关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及 if 语句之内用 const 来定义常量。
定义和用法
glob() 函数返回匹配指定模式的文件名或目录。
该函数返回一个包含有匹配文件 / 目录的数组。如果出错返回 false。
<?php
print_r(glob("*.txt"));
?>
输出类似:
Array
(
[0] => target.txt
[1] => source.txt
[2] => test.txt
[3] => test2.txt
)
<?php
$data = array('foo', 'bar', 'baz', 'boom', 'cow' => 'milk', 'php' =>'hypertext processor');
echo http_build_query($data) . "\n";
echo http_build_query($data, 'myvar_');
?>
以上例程会输出:
0=foo&1=bar&2=baz&3=boom&cow=milk&php=hypertext+processor
myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&cow=milk&php=hypertext+processor
20.
Content-Type:用于定义用户的浏览器或相关设备如何显示将要加载的数据,或者如何处理将要加载的数据
MIME:MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
text/html的意思是将文件的content-type设置为text/html的形式,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。
text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理。
将某个格式的时间转为标准对象
$filename = $pathinfo['filename']; // 19112906
$date = date_create_from_format('ymdH', $filename);
$send_time = $date->format('Y-m-d H:i:s'); // 2019-11-29 06:00:00
$hour = $date->format('H');
function debug_backtrace()