加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何检查SPL堆栈中是否已存在某个函数?

发布时间:2020-12-13 16:43:40 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试使用spl_autoload_register,我想创建一个if()语句,它将检查类方法是否已经注册. 例如: if (spl_autoload_function(array($this,'_loadClass')) // Then do nothingelse // Then run spl_autoload_register(array($this,'_loadClass)); 是否可能像
我正在尝试使用spl_autoload_register,我想创建一个if()语句,它将检查类方法是否已经注册.

例如:

if (spl_autoload_function(array($this,'_loadClass'))
    // Then do nothing
else
    // Then run spl_autoload_register(array($this,'_loadClass));

是否可能像上面的代码/方法?

解决方法

I am trying to do an autoloader and I want to create an if statement that will check if the class method as already been registered.

你不应该.没有必要做if语句; spl_autoload_register将忽略具有相同参数的第二个调用:

<?php

$foo = function( $class ) {
    return false;
};

spl_autoload_register( $foo );
var_dump( spl_autoload_functions( ) );

spl_autoload_register( $foo );
var_dump( spl_autoload_functions( ) );

输出显示虽然我们两次调用spl_autoload_register,但仍然只有一个自动加载器;

array(1) {
  [0]=>
  object(Closure)#1 (1) {
    ["parameter"]=>
    array(1) {
      ["$class"]=>
      string(10) "<required>"
    }
  }
}
array(1) {
  [0]=>
  object(Closure)#1 (1) {
    ["parameter"]=>
    array(1) {
      ["$class"]=>
      string(10) "<required>"
    }
  }
}

如果你想确保一个类没有自己注册两次,你当然可以在某种静态成员中设置它;

<?php
class Foo {
    protected static $registered = false;

    public function register( ) {
        if( self::$registered !== false ) {
            return;
        }
        echo "spl_autoload_register( $this,'_loadClass' );n";
        self::$registered = true;
    }
}

$foo = new Foo( );
$foo->register( );

$bar = new Foo( );
$bar->register( );

输出显然是一行:

spl_autoload_register( $this,'_loadClass' );

那就是说,你为什么要编写自己的自动加载器?已经有很多,很难相信它们都不符合你的要求.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读