周五要用 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的份额正在不断失去,它还在吃老本,但是当对手始终可以秒杀你的时候,你靠吃老本也会很快耗完,赶快醒悟吧。
分享到:
相关推荐
XML 元素中,"<" 和 "&" 是非法的。"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。"&" 也会产生错误,因为解析器会把该...[CDATA[文本内容]]>CDATA的文本内容中不能出现字符串“]]>”,另外,CDATA不能嵌套。
[CDATA["&fromusername&"]]></ToUserName>" &_ "<FromUserName><![CDATA["&tousername&"]]></FromUserName>" &_ "<CreateTime>"&now&"</CreateTime>" &_ "<MsgType>news</MsgType>" &_ "<ArticleCount>3</...
[CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></...
[CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml...
ATTLIST 电话 类别 CDATA "移动电话"> ]> <联系人列表> <说明>&content;</说明> <联系人> <姓名>刘保文</姓名> <ID>201003101115</ID> <公司>腾飞汇通有限公司</公司> <电话 类别="移动电话">18993380967</...
自己将数据导入到xml中的,希望有需要的朋友可以自己下载,格式为<!DOCTYPE PCAroot[ <!ELEMENT PCAroot (Province*)> <!ELEMENT Province (City*)> <!ELEMENT City (Area*)> <!ELEMENT Area (#PCDATA)> <!...
<preconditions><![CDATA[1.使用udp_bi用户在PLSQL正常登陆UAT数据库<br> (UAT数据库IP: 10.0.13.178)<br> 2.数据库脚本已下载至本地环境]]></preconditions><importance><![CDATA[2]]></importance><steps> <step>
本文给大家解析使用<![CDATA[ ]]>解决xml文件不被转义的问题, 对mybatis 中的<![CDATA[ ]]>相关知识感兴趣的朋友一起看看吧
[CDATA[gh_33bb5907f91e]]></ToUserName> <FromUserName><![CDATA[ojLh3jkYtiszyEY-_sM_8yrNxSc4]]></FromUserName> <CreateTime>1363231643</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><...
<srvver>1.0</srvver> <srvcode>000</srvcode> <payload> <param type=XML key=data> <![CDATA[ <Response> <Execution> <Status code=0 sql_code=0 description=执行成功!/> </Execution> <ResponseContent...
[CDATA[10]]></LoginTimeOut> <QueryTimeOut><![CDATA[3600]]></QueryTimeOut> 原始set.xml数据库连接节点缺少以上两个节点请添加,LoginTimeOut为数据库连接超时时间,单位秒,QueryTimeOut为SQL语句执行超时时间...
[CDATA[//><!-- var scrollPic_02 = new ScrollPic(); scrollPic_02.scrollContId = "ISL_Cont_1"; //内容容器ID scrollPic_02.arrLeftId = "LeftArr";//左箭头ID scrollPic_02.arrRightId = "RightArr"; //...
微信小程序支付JSAPI交易类型 已通过测试 返回例子如下: <xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <result_code><![CDATA[SUCCESS]]></result_code>
<settings> <data_type>xml</data_type> <!-- [xml] (xml / csv) 数据类型xml/csv--> <csv_separator>;</csv_separator> <!-- 如果使用csv作为数据的话,需要使用这个属性;表示文件数据分隔符,(平常以";...
[CDATA[http://t{$serverpart}.tianditu.cn/DataServer?T=cia_w&X={$x}&Y={$y}&L={$z}]]></url> <serverParts>0 1 2 3 5 6 7</serverParts> <backgroundColor>#00000000</backgroundColor> </customMapSource> </...
[CDATA[FAIL]]></return> <return><![CDATA[openid is invalid]]></return> </xml> 原因是,传有效过去不是的opendid。不小心看错了,把用户id 当做openid传过去了。 当统一下单成功,会返回以下格式的...
4、支持 CDATA 。5、开源(如果有任何问题可以自己修改)。缺点:。1、加载速度稍微逊色于支持库,但是查询速度很快。2、不支持DTD,也就是类似于如下的节点。 <!DOCTYPE note [。 <!ELEMENT note (to,from,...
android 使用saxparser 解析<![CDATA[ ]]>标签数据。 见附件实例
<sex>girl</sex><!--这个sex和teacher根元素中的sex发生命名冲突--> </student> </teacher> 2、名域的声明 (1)直接定义 xmlns:名域前缀="名域的URI"(唯一性) 类比:名字与身份证 名域的使用,名域...