Main Content RSS FeedArticles Entry

"__autoload" 进一步理解

上次说过 "__autoload" 的用法--------自动加载对象所需的类文件

原本我理解为当使用 new 产生一个对象时如果没有手动加载这个类的话,将使用 __autoload方法查找并加载此类.后面发现如果A类是一个抽象类,B类继承于A类. 这个时候如果没有手动加载A类. 那么__autoload方法也会自动加载这个抽象类A.

代码如下
  1. // include/class_A.php
  2. class A
  3. {
  4.     var $asd = '<br />father<br />';
  5.     public function __construct(){
  6.  
  7.     }
  8. }
  9.  
  10. // include/class_B.php
  11. class B extends A
  12. {
  13.     public function __construct(){
  14.         echo $this->asd;
  15.     }
  16. }
  17.  
  18. //index.php
  19. function __autoload($class){
  20.     require_once(ROOT_PATH.'include/class_'.$class.'.php');
  21. }
  22.  
  23. $a = new B();

有节省手动加载类的麻烦事了.

mysql_connect()和mysql_pconnect()区别

mysql_connect()是我们常用的打开Mysql数据库连接的函数.  

代码如下
  1. mysql_connect(server,user,pwd)


  这个函数打开的是非持久的 MySQL 连接. 当脚本一结束, 到服务器的连接就被关闭. 如果想提前关闭连接可以使用mysql_close().

而mysql_pconnect()是打开一个到 MySQL 服务器的持久连接的方法.  

代码如下
  1. mysql_pconnect(server,user,pwd)


mysql_pconnect()与mysql_connect()的主要区别在于当连接的时候mysql_pconnect()函数将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接, 如果找到, 则返回此连接标识而不打开新连接.
其次, 当脚本执行完毕后到 SQL 服务器的连接不会被关闭, 此连接将保持打开以备以后使用(mysql_close() 不会关闭由 mysql_pconnect() 建立的连接).  

其实在CGI方式下 这两种连接并没有什么区别, 在CGI模式下每个PHP访问都为一个进程, 访问结束后进程也就结束了, 所有的资源也都被施放了.

但php以apache模块方式运行时, 由于apache有使用进程池, 一个httpd进程结束后会被放回进程池, 这也就使得用pconnect打开的的那个mysql连接资源不被释放, 于是有下一个连接请求时就可以被复用. 所以在apache并发访问量不大的时候, 由于使用了mysql_pconnect(), php节省了反复连接db的时间,  使得访问速度加快.

但是当并发数很大时就容易产生mysql_pconnect()还在处理任务时, 新的请求来到, 于是又建立一个持续连接.由于这个连接并不会在程序结束时关闭.所以会一直存在.当某一时刻并发数超过Mysql连接上限时就会产生很多访问变为连接超时.

所以如何选用在于最后程序部署的环境以及网站的并发量.所以Discuz有个选项就是让站长们自己来衡量自己的网站再来选取数据库连接的方式.

“__autoload” 自动加载对象所需的类文件

看了一下Zend Framework 觉得这个框架中的一个自动加载类的方式有点好玩,只需要把自己写的类文件按一定规则命名,然后放在指定的文件夹中 就能在程序中直接生成对象,很是方便呀.

昨天闲逛时发现,原来PHP5的 "__autoload" 的全局函数会自动帮忙加载对象所需的类文件喔,真的是太棒了,呵呵.

下面来说说这个函数怎么用的.

在根目录下建一个 index.php

代码如下
  1. <?php  
  2.    function __autoload($class)  //这里$class 就是类名
  3.    {  
  4.        //这里是加载类,并定义文件的命名规范,这里是以class_*.php的格式命名
  5.        include_once ("class_" . ucfirst($class) . ".php");  
  6.    }  
  7.  
  8.    //生成一个对象
  9.    $u = new Example;
  10. ?>




在根目录下建立一个class_Example.php

代码如下
  1. <?php
  2.     class Example  
  3.     {
  4.         public function __construct()
  5.         {
  6.             echo '很好很强大';
  7.         }
  8.     }
  9. ?>



这个方法真的是非常的好.省掉以前 许许多多的 include require 呵呵

 

PHP - 函数:sprintf()

sprintf()函数的作用是:输出格式化字符串到变量。

代码如下
  1. sprintf(format,arg1,arg2,arg++)
  2. //arg1, arg2, ++参数将被插入到主体字符串中的百分号(%)之后。这个函数是“一步一步[step-by-step]”执行的。在第一个“%”之后插入arg1,在第二个“%”之后插入arg2,依次类推。




今天在看代码时发现书上是这样写的:

代码如下
  1. $query = sprintf('select count(*) from %s where username = ?', $this->_table);
  2.            
  3. $result = $this->_db->fetchOne($query,$username);



于是很困惑 " %s "是什么意思 是怎么样让查询指定到相应的数据表.
查询了下才知道 原来是sprintf()函数起的作用 把$this->_table的值传递给 %s 了.

如何定义其中变量的格式,可能值如下:
%% -返回百分号

%b –返回二进制数

%c –返回与ASCII值相对应的字符

%d –带有正负号的十进制数

%e –科学计数符号(如:1.2e+2)

%u –不带正负号的十进制数

%f – 浮点数据(本地设置)

%F –浮点数据(非本地设置)

%o –十进制数

%s –字符串

%x –十六进制数(小写字母)

%X –十六进制数(大写字母)