免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 7275 | 回复: 47
打印 上一主题 下一主题

讨论一下php的类 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-08 16:35 |只看该作者 |倒序浏览
这里冷了好久了,今天提出一个关于php的类的问题,望各位谈谈自己的看法,以达到抛砖引玉的目的。
问题一:php的类的效率究竟怎么样?(最好有测试实例)
问题二:各位在什么情况下会用到php的类?常用不常用?
问题三:在php中序列化(serializing)是否有必要?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-12-08 18:12 |只看该作者

讨论一下php的类

>;问题一:php的类的效率究竟怎么样?(最好有测试实例)
效率有很多种,你说的恐怕是执行效率,速度肯定没有不用类快。
OOP的目的并非在于代码执行效率上的提高,而是代码维护和设计上的方便,而且还要看设计者对OOP的理解,OO并非是万能的,用得不好,不但损失执行效率,维护起来也会麻烦。

>;问题二:各位在什么情况下会用到php的类?常用不常用?
常用

>;问题三:在php中序列化(serializing)是否有必要?
我也有此疑问,对象的serializing我清楚是怎么回事,但是不清楚的是什么时候会需要到serializing,还没有碰到这种需求,望各位达人有以教我,增长见识。
longnetpro 该用户已被删除
3 [报告]
发表于 2003-12-08 20:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-12-09 10:42 |只看该作者

讨论一下php的类

使用php类的执行效率争论的很多。不知道楼上两位有没有自己写一个测试代码测试一下,我想这样更有说服力。

有很多人很不赞成大量的封装,说会造成执行效率降低。但在一些大中型项目上,使用这些类会省很多事。我想知道怎么样才能在这两点上找到一个最好的切合点?
我过几天会得到一个中大型网站的源代码,据说根本就没有用到一个类!到时与大家分享一下。

论坛徽章:
0
5 [报告]
发表于 2003-12-09 10:50 |只看该作者

讨论一下php的类

我实验的结果好象不是这样~~不知道是不是我的代码有问题~~~~
其实类封装只不过是一种形式,不论解释语言还是编译语言我觉得在编译器面前不应该有区别。
class test
{
$i;
fuction($a)
{
$i=$a;
}
}

$i;
fuction($a)
{
$i=$a;
}
在本质上没有区别~~~

下面是我实验的代码,在我的机器上类的比不用类的多数情况下快~~~
<?php
class test
{
        function add()
        {
                for($c=0;$c<5000000;$c++){
                        $g=1+1;
                }
        }
}
$nowtime = explode(" ", microtime());
$starttime = $nowtime[1] + $nowtime[0];
for($c=0;$c<5000000;$c++){
        $g=1+1;
}
$nowtime = explode(" ", microtime());
$endtime = $nowtime[1] + $nowtime[0];
$totaltime = ($endtime - $starttime);
echo $totaltime."<br>;";

$nowtime = explode(" ", microtime());
$starttime = $nowtime[1] + $nowtime[0];
$c = new test;
$c->;add();
$nowtime = explode(" ", microtime());
$endtime = $nowtime[1] + $nowtime[0];
$totaltime = ($endtime - $starttime);
echo $totaltime;
?>;
longnetpro 该用户已被删除
6 [报告]
发表于 2003-12-09 11:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2003-12-09 12:06 |只看该作者

讨论一下php的类

我用mikespook代码在我的机器上测试了一下:
配置:win2000 server + apache 1.3.28 + php4.3.3   CPU:C1.2G 256MSDRAM
测试9次,每执行完一次就刷新一次。
数据如下:
第一行是用函数,第二行是用类的测试结果。
5.9582079648972
6.3706979751587

5.8113529682159
5.8560619354248

5.8661880493164
5.7080310583115

5.8290740251541
5.7002680301666

5.8636230230331
5.6893019676208

5.782252907753
5.7040009498596

5.8606799840927
5.725781917572

5.778746008873
5.9094309806824

6.2650370597839
6.193382024765
我把$g=1+1;改为$g+=1;的测试结果。
5.6033079624176
6.5898529291153

5.6008509397507
5.5063310861588

5.569482922554
5.5638710260391

5.5429639816284
5.5180859565735

5.635950922966
5.5657910108566

5.5429580211639
5.5499809980392

5.6193469762802
5.5487819910049

5.547052025795
5.4819489717484

5.5688099861145
5.4736850261688

结果发现一个有趣的现象,在第一次执行时,用类没有直接用函数快,第二次后,用类反而在多数时候比直接用函数还要快。我没有用zend编译执行。
要是用了zend,用类的效率是不是会更好?!!!谁说php的OOP不行?

当然,这个程序只是测试出了php类的数学计算能力。

论坛徽章:
0
8 [报告]
发表于 2003-12-09 12:32 |只看该作者

讨论一下php的类

在php中序列化是很有必要的,尤其当你在不同的页面传递很多不同的变量时。通过序列化,可以把变量的内容以字符串的形式保存。如果你研究过一些经典的PHP程序如VBB,你会发现序列化用得比较多,当用cookie or post/get方法很不方便时,它的优势就会明显。比较常用的就是把数组(包含一些用户登录后的数据)序列化再用MD5加密后,用setcookie的方法保存,需要时再反序列化回来,十分方便处理。
序列化的另外一个重要应用是:对象的序列化。需要在不同页面间传递对象变量时,可以使用。
当然你也可以把序列化后的结果保存到数据库,需要时再调用。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2003-12-09 12:47 |只看该作者

讨论一下php的类

cyberteddy  说的:“序列化的另外一个重要应用是:对象的序列化。需要在不同页面间传递对象变量时,可以使用。
当然你也可以把序列化后的结果保存到数据库,需要时再调用。”

在不同页面传递变量时我们一般用session就够了。
我就是不知道在什么情况下我们需要用到它(序列化)。它有哪些优点。变量多的时候我都用session数组。
不知道你有没有这方面的案例?

论坛徽章:
0
10 [报告]
发表于 2003-12-09 13:16 |只看该作者

讨论一下php的类

原帖由 "tonera" 发表:
cyberteddy  说的:“序列化的另外一个重要应用是:对象的序列化。需要在不同页面间传递对象变量时,可以使用。
当然你也可以把序列化后的结果保存到数据库,需要时再调用。”

在不同页面传递变量时我们一般用s..........

[quote]原帖由 "cyberteddy"]在php中序列化是很有必要的,尤其当你在不同的页面传递很多不同的变量时。通过序列化,可以把变量的内容以字符串的形式保存。如果你研究过一些经典的PHP程序如VBB,你会发现序列化用得比较多,当用cookie or post/ge..........[/quote 发表:

在不同页面传递很多不同变量可以使用Session,而不是专门的serialize()函数(当然Session内部使用到了序列化的技术)这个函数主要是为了保存复杂的数据结构设计的比如说对象,相当于把具有活力的精子,快速冷冻保存一样,将来需要的时候可以解冻恢复活力。

但是由于序列化采用的是字符方式保存复杂对象,对于对象的成员能够完整的保存和恢复,但是对于对象的方法不能够尽善尽美,如果需要完全恢复这个对象必须要有这个对象的类的声明。

从手册上抄一段:

  1. <?php
  2. // classa.inc:
  3.   
  4. class A
  5. {
  6.      var $one = 1;
  7.    
  8.      function show_one()
  9.      {
  10.          echo $this->;one;
  11.      }
  12. }
  13.   
  14. // page1.php:

  15. include("classa.inc");
  16.   
  17. $a = new A;
  18. $s = serialize($a);
  19. // store $s somewhere where page2.php can find it.
  20. $fp = fopen("store", "w");
  21. fputs($fp, $s);
  22. fclose($fp);

  23. // page2.php:
  24.   
  25. // this is needed for the unserialize to work properly.
  26. include("classa.inc");

  27. $s = implode("", @file("store"));
  28. $a = unserialize($s);

  29. // now use the function show_one() of the $a object.   
  30. $a->;show_one();
  31. ?>;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP