周五要用 method_exists 这个函数,当然如果再源头说用这个函数都是无奈,在别的语言我完全可以依靠try catch来解决问题,但是在php我却不敢这么做,原因是它的除错很有可能先die了,这会导致严重的问题,而try是无法捕捉这个错误的,原因是它的执行不是堆栈的或者说它的执行不是程序所看到的堆栈流程,于是php里多了很多服务于try操作的函数,比如 method_exists。其实用这个函数很简单不会出问题,但我今天想说说更深层次的东西。
首先看看这个函数的定义:
bool method_exists ( object object, string method_name )

Just a note that the behaviour of this function changed between version 5.0.x and 5.1.x when using static member functions

Using this code:
<?php
class a
{
   static function
test() {return "A"
;}
}
if(
method_exists('a','test'
))
   print
call_user_func(array('a','test'
));
else
   print
"Nothing"
;
?>
PHP 5.1.x returns "A"
PHP 5.0.x returns "Nothing"

Im not sure of a workaround for PHP 5.0.x yet.


看到没有,这个函数表现变了,因为5.1的时候发现如果方法是static的时候(也就是没有实例的域操作)无法判断了,我一开始也遇到了这个问题原因是我只看了定义,呵呵。而在5.1中它扩展了这个函数使得能够判断static 函数了,这从侧面折射出php是一种相当不成熟的语言,很显然在5.0时没有考虑这个需求,但实际上这个需求5.0肯定存在,但为什么存在呢?这是显而易见的。。。php社区的核心程序员思想是老旧的(这不是什么出言不逊,如果要明证这点,我还有很多例子,有人说你不要对php的oo提那么高的要求,问题是我不提,它的所有竞争对手都在这方面秒杀了php,php的前景黯淡,至少我是这么认为的)

对于php的oo我想我没有要求了,只要你正确就好了,语法支持我再要求一个重载就好了,其他的不提了。但我渐渐开始思考php究竟怎么发展,走标准oo意味着它必须抛弃所有的过去,也就是完全和老版本不兼容这个东西在python上是看到了3.0是不支持2.0的就是这样,这样才能大踏步的往前因为这样没有包袱。但php不同,php的优势在于众多的历史项目,如果抛弃了它,那么意味着更多人抛弃php,这不是太现实,因为它有很沉重的历史负担。那么究竟应该怎么发展呢?我想完全可以依靠标记,也就是annation,这是一个好东西,这种编程方式就像写附注一样,而且有很简单。
比如上述的我们可以这样考虑
class test{

static $cmd="xxx";
@catch::NoMethodException 就是说抓住下面的错误如果抛出了nomethodexception
@catch::NullPointedException
static initSystem(){
....
}

static function target(){
....
}

这只是一个猜想的例子,我也觉得这样不是最合适的,呵呵,当然我们可以寻找更好的模式来,这是借鉴了java的模型。

这种语言更接近于脚本的习惯,而在编译器端也是很好开发的(这点已经被java所证明了),而这种语法的好处是,即使php不支持它大不了可以忽略这些语句,也就是程序会可能变得不够强壮,但不会不能使用,这就是它的妙处,而这样也就有效解决了语言的继承关系又不失它的oo规范,既然一条路走不通我们就应该走另外的道路,php也是,但目前来说,我看到的php依然固我,这是很令人失望的。

在亚马逊的统计上也看得到php的份额正在不断失去,它还在吃老本,但是当对手始终可以秒杀你的时候,你靠吃老本也会很快耗完,赶快醒悟吧。

你可能感兴趣的:(编程,PHP,python,脚本,OO)