php 常看常记

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~

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

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值