类中的require_once()

时间:2011-05-14 23:43:03

标签: php class function require

我注意到如果我在类方法中声明一个与外部函数同名的函数,我会收到错误:

function a(){
  ...
}

class foo{
  public function init(){
    function a(){  // <- error
    ...    
    }
    ...
  }

}
然而,这会起作用:

function a(){
  ...
}

class foo{
  public static function a(){
    ...
  }
}

我可以使用require_once或类似的东西包含一组充当此类静态方法的函数吗?

require_once('file.php');无效后

class foo{ ...

4 个答案:

答案 0 :(得分:3)

PHP允许在其他人中嵌套函数声明,但它实际上没有嵌套函数。它们总是在全球范围内。因此,您在a()方法中定义的init与已定义的function a()发生冲突。

static function a()与类命名空间相关联,即使它的行为类似于函数,也不是方法。

无法在类定义中调用require_once语句。 PHP语法不允许它。类定义是特殊的作用域/语言结构,它只允许在即时解析级别内进行函数或变量声明。 - 所以PHP不允许这样做(类和它们的方法必须一次声明,而不是组装),并且没有真正好的或可取的解决方法来满足您的需求。

答案 1 :(得分:1)

要回答这个问题:您应首先使用a检查功能function_exists是否已经实施:

class foo{
  public function init(){
    if(!function_exists('a')):
    function a(){  // <- will only be declared when it doesn't already exist
        ...    
    }
    endif;
    ...
  }

}

但是,请将此视为非常糟糕的编码习惯。由于你不知道究竟发生了什么以及将使用什么功能,它很快就会变得一团糟。我会说你最好使用子类和require_once相应的子类。

答案 2 :(得分:1)

假设没有定义第二个“a”方法是不可接受的,你需要将它移到init方法之外。

听起来你的require_once调用是问题(绝对不应该在类中调用)。你可以发一个完整的样本,包括你的require_once调用吗?

答案 3 :(得分:1)

如果您的类结构允许,您可以将类拆分为几个不同的类,这些类是继承链的一部分:

class foo1 {
    public static function a() {}
}
class foo extends foo1 {
    public static function b() {}
}

或者,如果您愿意接受性能影响,可以使用__callStatic()。 (需要PHP 5.3;但如果你只需要非静态方法,__ call可以从5.0获得。)Smarty 3执行这个IIRC。

class foo {
    private static $parts = array('A', 'B');
    public static __callStatic($name, $arguments) {
        foreach (self::$parts as $part) {
            if (method_exists($part, $name)) {
                return call_user_func_array(array($part, $name), $arguments);
            }
        }
        throw new Exception();
    }
}
class A {
    public static function a() {}
}
class B {
    public static function b() {}
}

PHP 5.4将supposedly包含特征,这是在类中包含外部代码的更直接的方法:

class foo {
    use A, B;
}
trait A {
    public static function a() {}
}
trait B {
    public static function b() {}
}