of 是个操作符, 尽管很晚才增加进来, 而大多数语言都建有专门的函数和语法. 受Java影响吗? 类不是第一类? (我不知道它们是不是.)>> 但有一个 is_a 函数. 它有个可选参数指定是否允许对象实际是一个字符串命名的类.>> get_class 是函数; 没有 typeof 操作符. 同样有 is_subclass_of.>> 然而, 这对于内建类型无法工作, (再一次, int 不是个东西). 这样, 你需要 is_int 等等.>> 右值必须是变量或字面量; 不能是表达式. 不然会导致... 一个解析错误.>> clone 是一个操作符?!>> OO 的设计是一只混合 Perl 和 Java 的怪物.>> 对象属性通过 $obj->foo, 但类属性是 $obj::foo. 我没见过任何其它语言这样做, 或者这样做有什么用.>> 而, 实例方法仍然能通过静态的(Class::method)调用. 如果从其它方法中这么调用, 会在当前 $this 上被看成常规的方法调用. 我认为吧.>> new, private, public, protected, static ,等等. 试图虏获 Java 开发者的芳心? 我知道这更多是个人的品位, 但我不知道为什么这些东西在一门动态语言中是必要的 -- 在 C++ 中, 它们中的大多数是有关汇编和编译时的命名决议.>> 子类不能覆盖 private 方法. 子类覆盖的公共方法也不可见, 单独调用, 超类的私有方法. 会有问题, 如在测试mocks对象时.>> 方法无法命名为, 例如 "list" , 因为 list() 是特殊的语法 (不是个函数) , 而解析器会被搞晕. 如此暧昧的原因无从得知, 而类工作得就很好. ($foo->list() 不是语法错误.)>> 如果当解析构造函数参数时抛出异常(如, new Foo(bar()) 而 bar() 抛出), 构造函数不会被调用, 但析构函数会. (已在PHP 5.3 中修复)>> 在 __autoload 和解析函数中的异常会导致 fatal 错误.>> 没有构造器或析构器. __construct 是个初始化函数, 像 Python 的 __init__. 无法通过调用类申请内存和创建对象.>> 没有默认的初始化函数. 调用 parent::__construct()的时候, 如果父类没定义它自己的 __construct 方法会导致 fatal 错误.>> OO 带来了个迭代器接口, 是语言规范的部分(如 ... as ...), 但该接口实际上没有内建实现(如数组) . 如果你想要个数组迭代器,你必须用 ArrayIterator 包装它. 没有内建方式能够让迭代器將其作为第一类对像工作.>> 类可以重载它们转化成字符串的方式, 但不能重载怎样转换成数字或任何其它内建类型的方式.>> 字符串, 数字, 和数组都有字符串转换方式; 语言很依赖于此. 函数和类都是字符串. 然而,如果没定义 __toString , 试图將换内建或自定义对像(甚至于一个闭包) 转换成字符串会导致错误, 甚至连 echo 都可能出错.>> 无法重载相等或比较操作.>> 实例方法中的静态变量是全局的; 它们的值跨越该类的多个实例共享.标准库Perl "某些需要汇编". Python 是 "batteries included". PHP 是 "厨房水槽, 它来自加拿大, 但所有的水龙头用C贴牌".概括>> 没有类型系统. 你可以编译PHP, 但必须通过 php.ini 指定要加载什么, 选项因扩展部分存在(將它们的内容注入到全局名称空间中)或不存在.>> 因为名称空间是最近才有的特性, 标准库一点没被打乱. 在全局名称空间中有上千个函数.>> 库的某些部分很不一致.>> 下划线 对 无下划线: strpos/str_rot13, php_uname/phpversion, base64_encode/urlencode, gettype/get_class>> “to” 对 2: ascii2ebcdic, bin2hex, deg2rad, strtolower, strtotime>> Object+verb 对 verb+object: base64_decode, str_shuffle, var_dump versus create_function, recode_string&