is_calleable、function_exits与method_exits函数用法

本文详细解析了PHP中的is_callable与method_exists函数,包括它们如何判断函数及类方法的有效性和可调用性。is_callable用于验证参数是否为合法的可调用结构,而method_exists则专注于确认类或对象方法是否存在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bool is_callable ( mixed $var [, bool $syntax_only [, string $callable_name ]] )

is_calleable是测参数是否为合法的可调用结构
第一个参数可以是函数名,可以是类或对象和方法数组。
第二个参数是否对方法名只做语法检查,不判断是否可以调用,默认false
第三个参数是将调用的名称传人一个变量中,感觉不咋常用

//判断方法是否能调用
function test(){};
$a = function(){};
$b = "test";
var_dump(is_callable("test")); //true
var_dump(is_callable($a)); //true
var_dump(is_callable($b)); //true
var_dump(is_callable("mock")); //false  一个不存在的函数
var_dump(is_callable("mock", true)); //true 只检查函数的语法

class TestClass
{
    public function testMethod(){}
    protected function protectedMethod(){} 
    private function privateMethod(){} 
}
$obj = new TestClass(null);
var_dump(is_callable(array("TestClass", 'testMethod')));//true 类方法
var_dump(is_callable(array($obj, 'testMethod')));//true 对象方法
var_dump(is_callable(array("TestClass", 'testMethod2')));//false 不存在的类方法
var_dump(is_callable(array("TestClass", 'testMethod2'), true));//true
var_dump(is_callable(array("TestClass", 'protectedMethod')));//false 受保护的类方法
var_dump(is_callable(array("TestClass", 'protectedMethod'), true));//true 只检查语法 
var_dump(is_callable(array("TestClass", 'privateMethod')));//false 私有类方法
var_dump(is_callable(array("TestClass", 'privateMethod'), true));//true
var_dump(is_callable(array($obj, 'privateMethod'), false, $name));//true 
echo $name;//TestClass::privateMethod

function_exists (string$function_name )
从参数可以看出传人的是一个函数的名字,不能传类或者对象方法。

bool method_exists ( object $object , string $method_name )
判断类或者对象方法是否存在,手册上object得类型提示有些不准确,传类的名字作为参数其实也行。

class TestClass
{
    public function testMethod(){}
    protected function protectedMethod(){} 
    private function privateMethod(){} 
}
$obj = new TestClass(null);
var_dump(method_exists($obj, "testMethod"));//true 类方法
var_dump(method_exists("TestClass", "testMethod"));//true 类方法
var_dump(method_exists("TestClass", "protectedMethod"));//true受保护类方法
var_dump(method_exists("TestClass", "privateMethod"));//true私有类方法
is_callable和method_exits在判断类方法时有一个区别,默认下is_callable函数要判断该方法能不能被正常调用,想protected和private方法返回的都是false,而method_exits就如它的名字所示,只是判断该方法是否存在,而不管能不能调用。

### SAP XK02 增强实现方法 对于SAP XK02事务码的增强,通常涉及客户主数据维护中的特定需求。通过使用多种技术手段可以实现在XK02中增加自定义功能或字段验证逻辑。 #### 使用User Exits进行增强 一种常见的做法是在标准程序中利用已有的用户出口(User Exit),这些接口允许开发者在不修改原厂代码的情况下扩展业务流程。针对供应商主记录更改场景下的具体应用,可以通过`EXIT_SAPLF01D_001`这个退出点来执行额外处理逻辑[^1]。 ```abap FUNCTION EXIT_SAPLF01D_001. *"---------------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" VALUE(KUNNR) LIKE KNA1-KUNNR *"---------------------------------------------------------------------- DATA: lv_message TYPE string. IF sy-tcode EQ 'XK02'. " 自定义逻辑, 如检查某些条件并显示消息 IF some_condition IS NOT INITIAL. MESSAGE 'Custom validation failed' INTO lv_message TYPE 'E'. WRITE: / lv_message. ENDIF. ENDIF. ENDFUNCTION. ``` #### 利用BAdIs (Business Add-ins) 除了传统的User Exits外,现代版本的SAP系统更推荐采用BAdI方式进行增强开发。这不仅提高了灵活性也便于后期管理和升级支持。对于XK02而言,可能涉及到如下所示的一个典型例子: - **类名**: `CL_EXAMPLE_BADI_FOR_XK02` - **方法签名**: ```abap METHOD if_example_badi~on_change_supplier_data. DATA: ls_address TYPE adrc, lt_telephone_numbers TYPE TABLE OF padteln. " 获取当前正在编辑的数据对象实例 READ TABLE it_adrc INTO ls_address WITH KEY addrnumber = is_vendor-address_number. " 执行必要的业务规则检验或其他操作... " 更新电话号码列表作为示范用途 SELECT * FROM padteln INTO CORRESPONDING FIELDS OF TABLE lt_telephone_numbers WHERE partnerid = is_vendor-vendor_id. " 进一步处理... ENDMETHOD. ``` 上述代码片段展示了如何创建一个新的BAdI实现类,并重写其中的方法以响应供应商信息变更事件。需要注意的是实际项目环境中应当依据具体的业务需求调整相应部分。 #### ALV Grid 报表展示改进 当需要对XK02界面上呈现的信息做进一步优化时,则可考虑引入ALV控件来自定义输出格式。此过程一般会涉及到报表编程技巧以及相关函数模块的应用,比如`REUSE_ALV_GRID_DISPLAY`用于快速构建表格视图。 ```abap CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = g_repid i_structure_name = 'ZSTRUCTURE_NAME' TABLES t_outtab = gt_output_table EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. " Handle errors here ENDIF. ``` 以上三种方式提供了不同层次上的增强可能性,在实践中可以根据实际情况灵活选用最合适的方案来进行实施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值