周五要用 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的份额正在不断失去,它还在吃老本,但是当对手始终可以秒杀你的时候,你靠吃老本也会很快耗完,赶快醒悟吧。
分享到:
相关推荐
微信小程序支付JSAPI交易类型 已通过测试 返回例子如下: <xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <result_code><![CDATA[SUCCESS]]></result_code>
[CDATA[ ]]> 用于包含 Mybatis 的标签(如 `<if>`、`<where>`、`<choose>` 等),否则这些标签将不会被解析。 实例如下:<select id="allUserInfo" parameterType="java.util.HashMap" resultMap="userInfo1"> <!...
[CDATA["&fromusername&"]]></ToUserName>" &_ "<FromUserName><![CDATA["&tousername&"]]></FromUserName>" &_ "<CreateTime>"&now&"</CreateTime>" &_ "<MsgType>news</MsgType>" &_ "<ArticleCount>3</...
[CDATA[ 文本内容 ]]>`,其中"文本内容"部分不能包含字符串"]]>",以防止提前结束CDATA段。同时,CDATA段不能嵌套,也就是说,一个CDATA段内部不能再有另一个CDATA段。 要将Java对象转换成XML并包含CDATA,我们可以...
[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[FAIL]]></return> <return><![CDATA[商户号mch_id与appid不匹配]]></return> </xml> 原因是我拿到的商户号不是这个公众号的。一定要检查是不是这个公众号的商户号。 免责声明:本站所有文章和...
ATTLIST course course_id ID #REQUIRED title CDATA #REQUIRED dept_name IDREF #REQUIRED credits CDATA #REQUIRED> <!ELEMENT instructor EMPTY> <!ATTLIST instructor IID ID #REQUIRED name CDATA #REQUIRED ...
[CDATA[gh_33bb5907f91e]]></ToUserName> <FromUserName><![CDATA[ojLh3jkYtiszyEY-_sM_8yrNxSc4]]></FromUserName> <CreateTime>1363231643</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><...
ENTITY % idType "ID CDATA #IMPLIED"> <!NOTATION ID NOTATION URI 'http://example.com/unique-id'> ]> <UserGroupSystem> <Group id="group1" ParentGroup="root"> <GroupName>管理员组</GroupName> ...
<first_name>Alan</first_name> <last_name>Turing</last_name> </name> <profession>computer scientist</profession> <profession>mathematician</profession> <profession>cryptographer</profession> </...
</body> </note> ``` 在这个例子中,`<!DOCTYPE note [...]>`定义了文档类型为`note`,并且规定了`note`元素包含`to`、`from`、`heading`和`body`这四个子元素,每个子元素都允许包含字符数据(#PCDATA)。 外部...
**示例**:定义一个`<note>`元素,其包含`<to>`、`<from>`、`<heading>`和`<body>`四个子元素,其中`<to>`、`<from>`和`<heading>`元素仅包含文本数据,而`<body>`元素可以包含文本和子元素。 ```xml <!ELEMENT note...
[CDATA[留言内容]]></content> </message> </messages> </gbook> ``` 4. **DTD定义**: - 用于定义XML文档的结构和约束条件。 - 例如,`<gbook>` 元素包含了 `<info>` 和 `<messages>` 两个子元素。 ```xml...
$xmlString = '<xml><item id="1">Value 1</item><item id="2">Value 2</item></xml>'; $xmlObject = simplexml_load_string($xmlString); ``` 2. **将SimpleXMLElement对象转换为关联数组**: 调用`json_...
2. '<':当遇到 '<' 时,状态变化到 '<',以判断是否是CDATA部分的起始。 3. '<!':继续往后读,检查是否是CDATA的开始。 4. '<![':继续,检查是否是CDATA的开始。 5. '<![C':继续,检查是否是CDATA的开始。 6. '...