我注意到如果我在类方法中声明一个与外部函数同名的函数,我会收到错误:
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{
...
答案 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() {}
}