<![CDATA[从 method_exists 说起]]>

本文讨论了PHP中method_exists函数的使用及其在不同版本间的差异,特别是在处理静态方法时的行为变化。作者对比了PHP与其他语言的异常处理机制,并提出了对PHP未来发展的一些思考。
周五要用 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 文件,否则如何识别和启用呢 cat discuz_plugin_monitor_tool.xml <?xml version="1.0" encoding="ISO-8859-1"?> <root> <item id="Title"><![CDATA[Discuz! Plugin]]></item> <item id="Version"><![CDATA[X3.5]]></item> <item id="Time"><![CDATA[2025-07-15 22:00]]></item> <item id="From"><![CDATA[运维监控规则对比系统 (http://yoursite.com/)]]></item> <item id="Data"> <item id="plugin"> <item id="available"><![CDATA[1]]></item> <item id="adminid"><![CDATA[1]]></item> <item id="name"><![CDATA[运维监控规则对比系统]]></item> <item id="identifier"><![CDATA[monitor_tool]]></item> <item id="description"><![CDATA[上传监控规则文件,与参考知识库进行比对,发现缺失的监控项]]></item> <item id="datatables"><![CDATA[]]></item> <item id="directory"><![CDATA[monitor_tool/]]></item> <item id="copyright"><![CDATA[ForOps]]></item> <item id="version"><![CDATA[1.0.0]]></item> <item id="__modules"> <item id="0"> <item id="name"><![CDATA[monitor_tool]]></item> <item id="menu"><![CDATA[监控规则比对]]></item> <item id="url"><![CDATA[]]></item> <item id="type"><![CDATA[1]]></item> <item id="adminid"><![CDATA[0]]></item> <item id="displayorder"><![CDATA[0]]></item> <item id="navtitle"><![CDATA[]]></item> <item id="navicon"><![CDATA[]]></item> <item id="navsubname"><![CDATA[]]></item> <item id="navsuburl"><![CDATA[]]></item> </item> </item> </item> <item id="version"><![CDATA[X3.5]]></item> </item> </root> [root@iZbp14ccarfizbeqtoicioZ monitor_tool]#
07-19
在 SQL 语句中,`<![CDATA[ ... ]]>` 并不是标准 SQL 的一部分,它主要用于 XML 文档中,用来标记一个字符数据块,在这个块内的所有字符都会被原样处理,不会被 XML 解析器解析为 XML 标签。 而 `ST_CD <> '1'` 是标准 SQL 语法,`<>` 是不等于的比较运算符,所以 `ST_CD <> '1'` 表示字段 `ST_CD` 的值不等于字符串 `'1'`。 ### 含义 在 SQL 查询中,`ST_CD <> '1'` 通常作为 `WHERE` 子句的一部分,用于筛选出 `ST_CD` 字段值不是 `'1'` 的记录。例如: ```sql SELECT * FROM your_table WHERE ST_CD <> '1'; ``` 上述 SQL 语句的作用是从 `your_table` 表中查询出 `ST_CD` 字段值不等于 `'1'` 的所有记录。 ### 用法 这种条件表达式可以用于各种 SQL 语句中,常见的使用场景如下: - **SELECT 语句**:用于筛选符合条件的数据行。 ```sql SELECT column1, column2 FROM your_table WHERE ST_CD <> '1'; ``` - **UPDATE 语句**:用于更新符合条件的数据行。 ```sql UPDATE your_table SET column1 = 'new_value' WHERE ST_CD <> '1'; ``` - **DELETE 语句**:用于删除符合条件的数据行。 ```sql DELETE FROM your_table WHERE ST_CD <> '1'; ``` ### 注意事项 - **数据类型**:要确保 `ST_CD` 字段的数据类型和比较值的数据类型一致。如果 `ST_CD` 是数字类型,应使用 `ST_CD <> 1` 而不是 `ST_CD <> '1'`。 - **空值处理**:`NULL` 值比较特殊,`ST_CD <> '1'` 不会包含 `ST_CD` 为 `NULL` 的记录。如果需要包含 `NULL` 值的记录,可以使用 `OR ST_CD IS NULL`。 ```sql SELECT * FROM your_table WHERE ST_CD <> '1' OR ST_CD IS NULL; ``` - **性能问题**:在大数据量的表中,频繁使用不等于条件可能会影响查询性能,因为数据库可能无法很好地利用索引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值