php 常看常记

来源:互联网 发布:centos7 安装python 编辑:程序博客网 时间:2024/06/05 03:24
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 关键字在类定义的外部定义常量。一个常量一旦被定义,就不能再改变或者取消定义。

常量只能包含标量数据(booleanintegerfloatstring)。 可以定义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(1234);
foreach (
$arr as &$value) {
    
$value $value 2;
}
// $arr is now array(2, 4, 6, 8)
?>
此方法仅在被遍历的数组可以被引用时才可用(例如是个变量)。<?php
foreach (array(1234) 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 的扩展名

# 使 PHP 看上去像未知的文件类型AddType application/x-httpd-php .bop .foo .133t
或者把它隐藏为 HTML 页面,这样所有的 HTML 文件都会通过 PHP 引擎,会为服务器增加一些负担:

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~


0 0