php随手记

1.判断对象类型

if ($object instanceof stdClass) {
    echo 'yes';
}

还有类似的函数

is_object
is_array
stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL,可以使用其传递变量参数,但是没有可以调用的方法。stdClass类可以被继承,只是这样做没有什么意义。

2.安装php的加密模块mcrypt

sudo rpm -ivh http://mirrors.sohu.com/fedora-epel/6/i386/epel-release-6-7.noarch.rpm
yum install php-mcrypt
sudo yum install php-mcrypt -y

php.ini添加

extension=mcrypt.so

3.跨域名的浏览,cookie是不能传递的,貌似可以用sso之类的东东实现,有空研究一下

4.php的int在32bit和64bit机器上能表示的最大整数不一样,前者最大2^31-1,超过就自动变成float,如果超过还强制成int就会溢出

32bit机器测试:

$idarray = explode(',', $ids);
foreach ($idarray as $index=>$value) 
	$idarray[$index] = (int)$value;
var_dump(2147483647);
var_dump(2147483650);
var_dump((int)2147483650);
var_dump($ids);
var_dump($idarray);die();
output:
int(2147483647) float(2147483650) int(-2147483646) string(10) "2789214350" array(1) { [0]=> int(2147483647) } 
64bit机器测试:
[dongsong@localhost 230_proc]$ php -r "var_dump(2147483647);var_dump(2147483650);"
int(2147483647)
int(2147483650)
官方文档的说明: http://www.php.net/manual/zh/language.types.integer.php

5.==和===的区别:==会在把两个值自动转换成同类型后再比较,而===在比较前不转换

6.温故而知新


7.无敌大坑(让我对PHP无尽反感,连个单步跟踪都没有,排查错误麻烦得好死):include/require(_once)的时候如果是在函数内部执行的,那么被引入的文件(a.php)的代码就会添加在函数内部这个位置,那么a.php中的定义的全局变量会变成局部变量,如果a.php中的某个函数对a.php中的全局变量做了global引入,这个函数在执行时会发现global引入的全局变量都是null。所以一般php文件引入最好放在文件开头(当然,这样也可能存在一个问题,那就是污染全局变量数组,自己权衡吧)

8.打开所有错误报告
error_reporting(E_ALL);
错误直接输出而不是写入日志文件
ini_set("display_errors", true);
显示php的所有配置
php -i

9.print_r($myObj,true) 不输出到屏幕而是作为返回值

10.对一个对php有抵触情绪的人来说,这个绝对是天坑(2014.1.24):

数组的数字化string key会自动变成int key,如果数字化string key超出32位机器php表示的int最大值(见本章item4)就会保留string key不变(今天做程序移植,老机器是32位,新机器是64位,所以踩坑里了),http://stackoverflow.com/questions/4100488/a-numeric-string-as-array-key-in-php

如果上述还不够坑的,那么再来看看array_shift(),将array的第一个单元移出并作为结果返回,将array的长度减一并将所有其他单元向前移动一位。所有的数字键名改为从零开始计数,文字键名将不变。(我今天遇到的BUG就是这两种的叠加,事实证明,不要让不懂技术的老板去买人家的软件产品,最终受苦的还是我们码农)

[dongsong@localhost php_study]$ cat array_key.php 
<?php
        $testkeys = array("3661516534025750", (float)3661516534025750);
        foreach($testkeys as $key) {
                echo "\nto test key : ";
                var_dump($key);
                $myarray = array();
                $myarray[$key] = 'hello,world';
                var_dump($myarray);
        }
        $myarray = array("3661516534025750"=>"hello", "3661516534025760"=>"world");
        echo "\nto test array_shift :\n";
        var_dump($myarray);
        array_shift($myarray);
        var_dump($myarray);
[dongsong@localhost php_study]$ php array_key.php 

to test key : string(16) "3661516534025750"
array(1) {
  [3661516534025750]=>
  string(11) "hello,world"
}

to test key : float(3.6615165340258E+15)
array(1) {
  [3661516534025750]=>
  string(11) "hello,world"
}

to test array_shift :
array(2) {
  [3661516534025750]=>
  string(5) "hello"
  [3661516534025760]=>
  string(5) "world"
}
array(1) {
  [0]=>
  string(5) "world"
}
[dongsong@localhost php_study]$ file /sbin/init
/sbin/init: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped





11.php mysql_connect()的问题:同一个进程用一样的参数调用该函数其实没有建立新的连接,如果函数内部建立了连接然后关闭连接,函数外面已有连接就失效了

http://no1.php.net/manual/zh/function.mysql-connect.php

参数new_link可以解决这个问题:如果用同样的参数第二次调用 mysql_connect(),将不会建立新连接,而将返回已经打开的连接标识。参数 new_link 改变此行为并使 mysql_connect() 总是打开新的连接,甚至当 mysql_connect() 曾在前面被用同样的参数调用过。

12.file_put_contents('/tmp/xds', print_r($data,true), FILE_APPEND|LOCK_EX);

     var_dump($t);die();

     不解释。


13.<2014.11.29> tbl_vouch_log.orderId, php入库时用的是orderid,入库成功。排查这个原因。转了一圈才知道mysql的列名和索引名是大小写不敏感的。
    知识点:
        1>php程序被httpserver执行时我们看不到看不到自己添加到stdout/stderr的调试信息,这时候用file_put_contents(filename, print_r(varname,true), FILE_APPEND| LOCK_EX )。这是大家经常用的方式。
        更简单的方式如下(参见http://us2.php.net/manual/en/book.outcontrol.php):
            ob_start(); //入口处
            //各种往stdout写的调试输出
            file_put_contents(filename, print_r(ob_get_clean(), true), FILE_APPEND| LOCK_EX); //清理所有输出并写入文件,只用一次即可。
        2>打开mysql常规查询的日志来跟踪sql(4.1没权限看mysql用户写的文件)
            set global general_log = ON;
            set global general_log_file ='/tmp/xds';
        3>我们GMT的php框架用的是php的PDO来做数据库操作,要打印最终的sql语句可以用debugDumpParams(参见http://us2.php.net/manual/en/pdostatement.debugdumpparams.php):
            ob_start();
            $query = "INSERT INTO `$tableName`($colName) VALUES($colValue)";
            $statement = $this->pdo->prepare($query);
            $statement->execute();
            $statement->debugDumpParams();
            file_put_contents('/tmp/xds', print_r(ob_get_clean(), true), FILE_APPEND);
        4>mysql配置大小写敏感的选项
            lower_case_file_system(http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_lower_case_file_system)
                mysql定位数据目录时需要用这个选项,只读变量,不能在mysql运行期修改
                OFF 文件名大小写敏感
                ON 文件名大小写不敏感
            lower_case_table_names
                0 表名按照指定的名字存储,比较时大小写敏感(在wins等大小写不敏感的系统上做这个设置没用;wins默认1,mac默认2)
                1 表名按照小写名存储,比较时忽略大小写
                2 表名按照指定的名字存储,但用小写名做比较
                用innodb表时,在所有平台都应配置为1
            列名和索引名在任何平台都是大小写不敏感的(http://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html),触发器是大小写敏感(who care)
            http://dev.mysql.com/doc/refman/5.1/en/identifier-case-sensitivity.html

14.数数PHP里面的那些坑(PS:这么说并不是我中招了,中这种招是几个PHP初学同事了。对于PHP变量生命期、array和stdClass的自动创建规则有了解的话就没什么奇怪的了。)

[dongsong@localhost php-study]$ cat localtest.php 
<?php
    for($i = 1; $i < 3; $i++) {
        $att[] = $i*10;
        var_dump($att);
    }
[dongsong@localhost php-study]$ php localtest.php 
array(1) {
  [0]=>
  int(10)
}
array(2) {
  [0]=>
  int(10)
  [1]=>
  int(20)
}
[dongsong@localhost php-study]$ cat stdobj_test.php 
<?php
    for($i=1; $i<3; $i++) {
        if ($i==1)
            $obj->a = 100;
        else
            $obj->b = 200;
        var_dump($obj);
    }
[dongsong@localhost php-study]$ php stdobj_test.php 
object(stdClass)#1 (1) {
  ["a"]=>
  int(100)
}
object(stdClass)#1 (2) {
  ["a"]=>
  int(100)
  ["b"]=>
  int(200)
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值