
2007-7-26 15:40
Haohappy
升级到PHP5的理由
[url]http://blog.joshuaeichorn.com/slides/CoolThingsInPHP5/[/url]
[b]A little History of PHP5[/b]
* July 13th 2004, PHP 5.0 released
* Nov 2006, PHP 5.2 released
* Go-php5.org
* December 31 2007, PHP4 EOL
* Upgrade Time
[b]Lots of reasons to upgrade[/b]
* Better OO
* Better XML
* Better Webservices
* Better Database libraries
* Userland code that acts like core constructs
* Faster
[b]Better OO[/b]
* Standard Reason for PHP 5
*
o public/private/protected
o Unified constructor name __construct()
o Destructor __destructor()
o Interfaces
o instanceof operator
o final methods/classes
o Explicit object cloning
o Class constants
o Static members/methods
o abstract classes/methods
o Class type hints
o dereferencing support $obj->method()->method()
o __autoload()
[b]Better XML[/b]
* Real DOM Support
* No more leaks etc
* Based on libxml2 (fast)
* SimpleXML
[b]Better Webservices[/b]
* JSON extension for quick serializing to from javascript
* SOAP extension that actually works
[b]Better Database Libraries[/b]
* Sqlite built in (you always have a db)
* Mysqli extension supports all the mysql 4.1+ features
* PDO provides native abstraction of databases covers all the majors
[b]Userland code that acts like core constructs[/b]
* A class can be used in a foreach (iterator)
* A class can be accessed like an array
* You can add virtual methods __call
* You can add virtual properties __get/__set
[b]Faster[/b]
* PHP 5.2 added lots of speed improvements
* Faster require_once
* Better memory management
* Lots of other stuff
[b][color=Red]So Upgrade[/color][/b]
* PHP 4 support is being dropped by everyone
* PHP 5 offers better faster easier to write code
[[i] 本帖最后由 Haohappy 于 2007-7-26 15:42 编辑 [/i]]
2007-7-26 16:04
diogin
interface里允许static function而abstract class里不允许abstract static function我觉得是个畸形。
5里面static有一些怪异的地方,也导致php6里出现static的延迟绑定的出现。
private的继承也不合逻辑,理论上继承应该继承所有的成员,包括private成员,如果规定private的不能继承,那么var_dump子类对象时就不应该出现父类的private属性,也就是说子类应该完全意识不到父类的private属性,而实际上是存在却不能访问。
再说PDO,名字起得就不对,PHP Data Object应该用在数据库抽象层上才对。而PDO本身的设计就有问题,stmt对象居然能变身。。
如果PDO设计成robust、flexible的Data Abstract Layer,那就应该严格按照关系数据库的实际领域对象来设计,而不是草草实现。在这一点上mysqli比PDO还要好一点。
另外,class并不能被iterate,应该是object。
当然了,虽然有一些地方不合人意,但总体来说PHP5还是非常值得使用的。
2007-7-27 21:36
cid73
[quote]原帖由 [i]diogin[/i] 于 2007-7-26 16:04 发表 [url=http://www.phpeye.com/bbs/redirect.php?goto=findpost&pid=488&ptid=114][img]http://www.phpeye.com/bbs/images/common/back.gif[/img][/url]
interface里允许static function而abstract class里不允许abstract static function我觉得是个畸形。
5里面static有一些怪异的地方,也导致php6里出现static的延迟绑定的出现。
private的继承也不合逻辑,理论上继承应该 ... [/quote]
[php]
interface I {
static function f();
}
abstract class A {
abstract protected static function f();
}
[/php]
这些现在都是可以的了, 而 private 成员不能被继承这应该是没有争议的吧.
2007-7-27 22:06
diogin
abstract static function可以是可以,但E_STRICT标准不允许,而且多态的static函数可以用
call_user_func(array($className, 'f'));
和
call_user_func_array(array($className, 'f'), array($var1, $var2));
来模拟调用。另外private成员不能被继承为什么没有争议呢?php的public/protected/private是依据代码所处的类的。
理论上继承应该继承所有特性,ppp是用来限定访问,后者并不能对前者有影响。
你extend一个有private属性的类,实例化一下扩展类的对象,然后var_dump一下这个对象试试。
2007-7-28 12:20
diogin
[php]<?php
class A {
private $name = 'hello';
}
class C extends A {
public function f() {
echo $this->name;
}
}
$o = new C();
var_dump($o); // object(C)#1 (1) { ["name:private"]=> string(5) "hello" }
$o->f(); // Notice: Undefined property: C::$name in D:\Development\Workspace\index.php on line 7[/php]
2007-7-29 09:36
Haohappy
这确实不合理,应该完全屏蔽的,对开发者来说没有用,说不定还会误导。
2007-8-1 14:57
wps2000
在vardump或者反射的时候增加一种修饰符 unreachabled,呵呵,都解决了
2007-8-1 17:45
Verdana
我觉得继承与 ppp 无关,因为某些成员是 private,所以访问上受到限制而已,不能访问并不意味着不能被继承。
如 diogin 的例子中, private $name,被限制只能在 A 类中被访问。
如果要访问 superclass 中的 private 属性,可以通过 superclass 中的 public/protected 方法来访问
比如:
[font=Courier New]
[php]
<?php
error_reporting(E_ALL | E_STRICT);
class A {
private $name = 'hello';
protected function getName() {
return $this->name;
}
}
class C extends A {
public function f() {
echo $this->getName();
}
}
$o = new C();
$o->f();
[/php]
[/font]
2007-8-2 01:08
diogin
其实Verdana的说法还是在原地绕圈子。看看下面这个例子,如果PPP跟继承无关,那么就应该这样(注意加“*”号的部分):
[php]
class A {
private $name = 'hello';
}
class C extends A {
public function f() {
$a = new A();
echo $a->name; // 这个肯定不能运行,因为访问$name的这部分 *代码不在A类里*
}
public function t() {
echo $this->name; // 这个理论上应该能运行,因为这个$name是从A类继承下来的,这个$name是 *C类对象的属性*,而不是 *A类对象的属性*
}
}
$c = new C();
$c->f();
$c->t();
[/php]
[[i] 本帖最后由 diogin 于 2007-8-2 01:10 编辑 [/i]]
2007-8-2 15:28
Verdana
感谢 diogin 的提醒,我看了一下源码,之前我的说法是错误的。
在 Compiling 代码时,如果发生继承,Zend 还是会检查 PPP 的,并不是全盘接收。
subclass 的 properties_info (HashTable) 会复制来自 superclass 的 properties,但不包括 private 的属性.
被 copy 的(protected/public)我猜测仅仅是 properties 的符号表,而值部分 subclass 和 superclass 应该是共享的同一块内存的(通过追加 ref)。
反射看一下到类或者对象的具体信息:
[font=Courier New]
[php]
<?php
Reflection::export(new ReflectionClass('C'));
Reflection::export(new ReflectionObject(new C));
[/php]
应该是这样了,呵呵~
页:
[1]
Powered by Discuz! Archiver 5.5.0
© 2001-2006 Comsenz Inc.