PHP中的类
作者:酷熊
我觉得自从使用PHP以来最难以理解的概念就是PHP的类。我除了正在学习MySQL一些基本知识以外,对于其他的数据库引擎没有经验。此前对于OOP面向对象编程我也没有经验,OOP对于我来说也是个新鲜事物,但是通过对其原理以及为何如此强大的理解,使我有了一定的我了解如果任何程序都用OOP来实现的话,无疑会得到一个强大的程序;但是对我而言,如果我只是认为自己了解了其中的机制,而不把这种理解应用到编程实践,OOP对我来说将始终停留在纸上谈兵的层次上。于是,几天前,在利用常规的函数来实现一些功能时,我尝试采用对象来实现,我发现的确这让我的工作更加简单了!于是我将这些经验写出来,希望能够帮助象我一样的人们。
类说穿了就是一些变量(OOP概念中的成员变量,译者注)和一些操作处理这些变量的函数(OOP概念中的成员函数)的集合。它提供了一种在程序中以现实生活的形态来思考问题的方法,换句话说,就是描述了一个对象。反之,一个对象或者实例,就是这个类的真正实现。比如说我们要描述一辆自行车:一个合适的自行车类应该含有如下变量:$pedals(脚蹬),$chain(链条),$front wheel(前轮),$rear wheel(后轮),$brakes(刹车), and $handl_bars(车把)。你可以参考现实生活中对一辆自行车的操作来实现你的脚本。比如可以通过向函数Accelerate()传递一个$Braking_Force,并将这个变量应用于你所定义的实例的其他变量如$front_wheel, $rear_wheel,也可以返回操作的结果,从而实现相应的操作。
看起来很美,但是这些通过常规的函数和变量不是也能够实现吗?不错,如果你的程序中只有一个自行车的实例,为它单独定义一个类的确意思不大,但是如果你需要很多自行车实例的时候呢?但是你程序中的变量传递流会变得相当复杂,你得时时保证每个自行车实例指定的变量都正确的传递给了不同的函数。但是使用对象大大降低了你所传递的变量的数量,因为对象中的处理函数(所谓的方法method,译者著。)自动的认定作用范围就限制在本对象之内,那么它所能够操作的对象也就限制在了对象范围内。而且对象的定义可以非常容易的包含到不同的脚本只用,(在得到可重用性的同时)还从而保证了每一个自行车的在不同的脚本中工作方式都是一致的。
让我们来创建一个实际的类,这个类我几乎用在了我站点的每一个页面中,也许你会从中发现值得参考的东西。
目前国内的主流程序主要存在以下问题
目前国内的主流程序主要存在以下问题(转)
作者[旅行]
1. 代码效率低下 - (以国内某著名论坛的post.cgi取得下个thread的数码的代码为例)
我无意攻击,我也不知道现在是否还是这个代码,这是2001年5月的版本。
我只对这个片段做个注释说明
$dirtoopen = "$lbdir" . "forum$inforum"; //打开相应的论坛版块的目录
opendir (DIR, "$dirtoopen");
@dirdata = readdir(DIR); //读取所有的文件
closedir (DIR); //关闭目录handle
@sorteddirdata = grep(/.thd.cgi$/,@dirdata);//取得所有主题文件
@newdirdata = sort numerically(@sorteddirdata);//排序
@neworderdirdata = reverse(@newdirdata);//倒序
$highest = $neworderdirdata[0];//取出最大的数码所在的文件名
$highest =~ s/.thd.cgi$//;//取得最大的数码
$newthreadnumber = $highest + 1;//加1得到此次发表应该的数码
大家可以看到,在发表一个新主题时,虽然代码很短,但是却把整个版块目录的文件全部扫描了
一遍并两次排序
假设这个目录有NN多个主题,则速度可想而知。
所以该“论坛看似速度慢,其实是由于JS多”的
论点
是否成立,大家考虑
2.代码不规范,属于手工作坊型
比如某国内著名CGI论坛,其程序组件命名令人莫名奇妙,又是 bbs, 又是 bbs1, bbs2,
有cjyh, xiu这种不知何来,还有yhreg这样的中文缩写+英文缩写的,
更糟糕的情况通常出现在中文程序的内部
Oracle Faq(如何在ORACLE中更改表的列名和顺序 )
如需转载,请注明出处!
用过ORACLE的人都知道,要想在ORACLE中更改表的列名和顺序可是一件很烦琐的事,下面给大家提供一种简单的方法。
SQL> select object_id from all_objects where owner='SCOTT' and object_name='T1';
OBJECT_ID
----------
6067
SQL> select obj#,col#,name from sys.col$ where obj#=6067;
OBJ# COL#
---------- ----------
NAME
------------------------------------------------------------
6067 1
ID
6067 2
NAME
SQL> update sys.col$ set name='NEW_ID' ,col#=3 where obj#=6067 and name='ID';
1 row updated.
SQL> update sys.col$ set name='MY_NAME',col#=1 where obj#=6067 and name='NAME';
1 row updated.
SQL> update sys.col$ set col#=2 where obj#=6067 and col#=3;
1 row updated.
SQL> commit;
Commit complete.
SQL> select * from scott.t1;
ID NAME
---------- --------------------
3 cheng
2 yong
1 xin
2 gototop
1 topcio
2 yongxin
1 cyx
7 rows selected.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 128159368 bytes
Fixed Size 732808 bytes
Variable Size 117440512 bytes
Database Buffers 8388608 bytes
Redo Buffers 1597440 bytes
Database mounted.
Database opened.
SQL> select * from scott.t1;
MY_NAME NEW_ID
-------------------- ----------
cheng 3
yong 2
xin 1
gototop 2
topcio 1
yongxin 2
cyx 1
7 rows selected.
到此为止我们已经把SCOTT.T1表中的列名和顺序都给该了,如果你只想改变顺序而不想改变列名,只需再进行UPDATE就可以了,之所以不能一次完成是因为SYS.COL$中COL#,NAME都是UNIQUE的。
这种方法虽然存在一定风险,但对于特别大的表效果是很明显的,而用一般的方法将需要更多的存储空间、回滚段和时间开销。
PHP3中文文档(续4)
为了理解SWITCH语句为了躲避语句冗长,知道它如何被执行的是非常重要的.SWITCH语句石一行一行 执行的(事实上,是一条语句一条语句).在开始时,没有代码被执行.仅仅当一个值于SWITCH表达式的语句的值相同的CASE语句被发现后,PHP继续执行语句直到SWITCH体的结束,或者出现了BREAK语句.如果你在一个分支语句的后面没有写BREAK语句,PHP将继续执行下面分支的语句.例如:
/* example 3 */
switch ($i) {
case 0:
print "i equals 0";
case 1:
print "i equals 1";
case 2:
print "i equals 2";
}
这里,如果$i等于0,PHP将会执行所有打印语句.如果$i等于1,PHP将会执行剩下的两个打印语句,并且仅仅当$i等于2的时候,你才能得到你期望的执行结果,只有’I equals 2’被显示.因此不要在每一个分支语句的后面忘记BREAK语句(即使你在一定的环境下有可能想避免提供他们).
一个特殊的分支是默认的分支.这个分支可以匹配任何其它分支没有匹配的事情.例如:
/* example 4 */
switch ($i) {
case 0:
print "i equals 0";
break;
case 1:
print "i equals 1";
break;
case 2:
print "i equals 2";
break;
default:
print "i is not equal to 0, 1 or 2";
}
另外一个值得一提的事实是CASE表达式可以是任何计算标量类型的表达式,也就是说,整型或实型和字符型.数组和对象将不会导致PHP崩溃,但是他们没有没有任何意义.
REQUIRE
REQUIRE语句使用指定的文件来代替它自己,与C语言中的#include语句非常相似。这意味着你不能把一个require()语句放在一个循环体中,并且期望它在每一次反复中都包含不同文件的内容.为了达到这个目的,可以使用INCLUDE语句。
require ('header.inc');
INCLUDE
INCLUDE语句包括和计算指定文件.
在每次遭遇INCLUDE语句的时候都会进行一次.因此你可以在一个循环体中使用INCLUDE语句.以用来包含一些不同的文件.
MySQL 3.23.40 又发布了
MySQL 3.23.40 又发布了。
修正了--low-priority-updates 和 INSERT 的问题。
修正了从进程在一些特别的情况下超前主进程 22 字节的问题。
为复制增加了 slave_wait_timeout
修正了 UPDATE 和 BDB 表的问题。
修正了BDB 表使用 key parts 的问题。
修正了使用 GRANT FILE ON database.* ...的问题。
修正了 DELETE FROM table_name ... LIMIT 0 和 UPDATE FROM table_name ... LIMIT 0 不能删除或者更新任何记录的问题。
CHECK TABLE 现在检查 auto_increment column 是否包含 0。
对 mysqld 发送 SIGHUP 信号只会刷新日志,不会重启复制。
修正了解析器允许类似 1.0e1 (e 后面没有符号)浮点数的问题。
myisamchk 的 --force 参数现在更新状态。
为 mysqld 增加 --warnings 参数,如果使用这个参数 mysqld 只是输出退出连接的错误信息。
修正了没有 PRIMARY KEY 的情况下,SHOW CREATE TABLE 的问题。
修正了更改名字 innodb_unix_file_flush_method 为 innodb_flush_method 的问题。
修正了转换 UNSIGNED BIGINT 到 DOUBLE 的问题。
修正了查询 BDB 空表时的问题。
修正了使用 COUNT(DISTINCT) 和 LEFT JOIN 时,没有匹配行的问题。
删除了文档中所有有关 GEMINI 表的部分,GEMINI 不再开放源码了。
抓取和分析
抓取和分析一个文件是非常简单的事。这个教程将通过一个例子带领你一步一步地去实现它。让我们开始吧!
首先,我首必须决定我们将抓取的URL地址。可以通过在脚本中设定或通过$QUERY_STRING传递。为了简单起见,让我们将变量直接设在脚本中。
<?
$url = 'http://www.php.net';
?>
第二步,我们抓取指定文件,并且通过file()函数将它存在一个数组里。
<?
$url = 'http://www.php.net';
$lines_array = file($url);
?>
好了,现在在数组里已经有了文件了。但是,我们想分析的文本可能不全在一行里面。为了解这个文件,我们可以简单地将数组$lines_array转化成一个字符串。我们可以使用implode(x,y)函数来实现它。如果在后面你想用explode(将字符串变量数组),将x设成"|"或"!"或其它类似的分隔符可能会更好。但是出于我们的目的,最好将x设成空格。y是另一个必要的参数,因为它是你想用implode()处理的数组。
<?
$url = 'http://www.php.net';
$lines_array = file($url);
$lines_string = implode('', $lines_array);
?>
现在,抓取工作就做完了,下面该进行分析了。出于这个例子的目的,我们想得到在<head>到</head> 之间的所有东西。为了分析出字符串,我们还需要叫做正规表达式的东西。
<?
$url = 'http://www.php.net';
$lines_array = file($url);
$lines_string = implode('', $lines_array);
eregi("<head>(.*)</head>", $lines_string, $head);
?>
让我们看一下代码。正如你所见,eregi()函数按下面的格式执行:
eregi("<head>(.*)</head>", $lines_string, $head);
"(.*)"表示所有东西,可以解释为,"分析在<head>和</head>间的所以东西"。$lines_string是我们正在分析的字符串,$head是分析后的结果存放的数组。
最后,我们可以输数据。因为仅在<head>和</head>间存在一个实例,我们可以安全的假设数组中仅存在着一个元素,而且就是我们想要的。让我们把它打印出来吧。
<?
$url = 'http://www.php.net';
$lines_array = file($url);
$lines_string = implode('', $lines_array);
eregi("<head>(.*)</head>", $lines_string, $head);
echo $head[0];
?>
这就是全部的代码了。
想学php5的来看看!!
PHP代码:--------------------------------------------------------------------------------
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
前言
今天突然想到PHP官方网站上一转,一眼就看到PHP5推出的通告。虽然以前看到过PHP5的预告,但还是仔细看了PHP 5/Zend Engine 2.0新特性一文,一股JAVA气息扑面而来...
分页类终结者
再点一次Active的名,我把你的函数功能扩充了一下,嘻嘻,现在能以树型结构列出整个磁盘上的文件啦。
把你的函数改写成递归函数,现在这个函数可以列出某指定目录内的所有文件及子目录内的文件啦。
用PHP实现动态产生XML文件以及从XML文件中抽取数据转化成HTML的小程序。。。不用DOM的。。
这个东东搞了我一天。。。可是到最后发现却无法实现自己想像中的那种效果。。。真是可惜。。。看来 PHP 对XML还需要加强。。。如果哪位对此有研究。欢迎来信探讨。。。 首先建表: CREATE TABLE books ( bookid int(4) NOT NULL auto_increment, bookname va
好了,我经过大家的支持现在已经成功的把access数据倒换为mysql形式,本人将奉献给那些需要的朋
第一步、做好数据库的准备。安装数据源(这个就费了我好几天了),首先点击控制面板中的
odbc数据源(32位)