PHP的autoload机制的实现解析

一、autoload机制概述
在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这也是OO设计的基本思想之一。在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可。 继续阅读PHP的autoload机制的实现解析

PHP优于Node.js的五大理由

PHP是一款服务器端的脚本语言,主要用于动态网页开发,是目前最流行的开发语言之一。Node是一款用来编写高性能网络服务器的JavaScript工具包。作者Jani Hartikainen发表了一篇博文,文中将两者进行对比,列举了PHP优于Node.js的五大理由。一起来看下。 继续阅读PHP优于Node.js的五大理由

PHP5.4新特性

PHP5.4正式前两天发布了,之前有看了一些PHP5.4主要特性相关文章,因此在这里小结一下。

其中好几点更新是由Laruence贡献的!本文部分内容也是源自Laruence的博客。

1. Buid-in web server
PHP5.4内置了一个简单的Web服务器,这样在做一些简单程序就方便多了,省去了环境配置的工作,特别对于初学者来说。
把当前目录作为Root Document只需要这条命令即可:

$ php -S localhost:3300

也可以指定其它路径:

$ php -S localhost:3300 -t /path/to/root

还可以指定路由:

$ php -S localhost:3300 router.php

参考:PHP: Build-in web server
继续阅读PHP5.4新特性

PHP变量名中的点

通常,PHP 不会改变传递给脚本中的变量名。然而应该注意到点(句号)不是 PHP 变量名中的合法字符。至于原因,看看:

< ?php
$varname.ext;  /* 非法变量名 */
?>

这时,解析器看到是一个名为 $varname 的变量,后面跟着一个字符串连接运算符,后面跟着一个裸字符串(即没有加引号的字符串,且不匹配任何已知的健名或保留字)’ext’。很明显这不是想要的结果。
出于此原因,要注意 PHP 将会自动将变量名中的点替换成下划线。 继续阅读PHP变量名中的点

PHP开发者常犯的10个MySQL错误

数据库是Web大多数应用开发的基础。如果你是用PHP,那么大多数据库用的是MySQL也是LAMP架构的重要部分。PHP看起来很简单,一个初学者也可以几个小时内就能开始写函数了。但是建立一个稳定、可靠的数据库确需要时间和经验。下面就是一些这样的经验,不仅仅是MYSQL,其他数据库也一样可以参考。

1.使用MyISAM而不是InnoDB
MySQL有很多的数据库引擎,单一般也就用MyISAM和InnoDB。
MyISAM 是默认使用的。但是除非你是建立一个非常简单的数据库或者只是实验性的,那么到大多数时候这个选择是错误的。MyISAM不支持外键的约束,这是保证数据 完整性的精华所在啊。另外,MyISAM会在添加或者更新数据的时候将整个表锁住,这在以后的扩展性能上会有很大的问题。
解决办法很简单:使用InnoDB。 继续阅读PHP开发者常犯的10个MySQL错误

升级bugfree2.1.3后无法记住密码解决办法

今天早上,升级bugfree至2.1.3后发现勾选“记住密码”会导致无法登录,但是php、nginx日志并没任何发现。
看了一下源码发现2.1.3版本开始使用了mcrypt类库:

但是从bugfree更新日志中并没有提到。
解决办法:
重新编译php开启mcrypt扩展,但在此之前要先安装libmcrypt-dev。步骤如下:

  1. apt-get install libmcrypt-dev
  2. ./configure [省略] –with-mcrypt

PHP中两个float(浮点数)比较的问题

最近在开发一个合同管理系统的时候,涉及到两个浮点数比较,算是把我郁闷惨了。
在N久以前,就不晓得从哪里听来的一个“不要用等号去比较浮点数”的“真理”,自己平时也在用,好像没有出现啥问题,可这次问题总算是来了。

通过反射机制获取PHP类的所有方法

想要获取一个PHP类的方法,大家可能很自然的想到了get_class_methods(),可手册中并没说明此函数返回的只是public类型的方法。
如果想要获取到包括私有和保护的所有方法,那需要用到PHP中反射类,还是通过例子来说明吧。

<?php
class Foo
{
    private function priFunc(){}
    protected function proFunc(){}
    public function pubFunc(){}
}

function get_class_all_methods($class){
    $r = new ReflectionClass($class);
    foreach($r->getMethods() as $key=>$methodObj){
        if($methodObj->isPrivate())
            $methods[$key]['type'] = 'private';
        elseif($methodObj->isProtected())
            $methods[$key]['type'] = 'protected';
        else
            $methods[$key]['type'] = 'public';
        $methods[$key]['name'] = $methodObj->name;
        $methods[$key]['class'] = $methodObj->class;
    }
    return $methods;
}

$methods = get_class_all_methods('Foo');
var_dump($methods);

结果:

array(3) {
  [0]=>
  array(3) {
    ["type"]=>
    string(7) "private"
    ["name"]=>
    string(7) "priFunc"
    ["class"]=>
    string(3) "Foo"
  }
  [1]=>
  array(3) {
    ["type"]=>
    string(9) "protected"
    ["name"]=>
    string(7) "proFunc"
    ["class"]=>
    string(3) "Foo"
  }
  [2]=>
  array(3) {
    ["type"]=>
    string(6) "public"
    ["name"]=>
    string(7) "pubFunc"
    ["class"]=>
    string(3) "Foo"
  }
}