我正在使用OpenCart并安装了modules sizes.xml,它编辑了catalog / product / model / catalog / product.php文件
它添加了一个类方法;
我在函数中遇到了一些代码的问题:
class ModelCatalogProduct extends Model {
public function getSizes($product_id) {
...
} // end function
} // end class
我们总是会收到错误消息,说我们无法重新声明getSizes方法。
我想要强制重新声明,或者在调用方法之前检查函数是否存在但是我不能在类中使用function_exists。
即,这似乎是非法的;
class ModelCatalogProduct extends Model {
// This throws up an error
if (function_exists('getSizes')==FALSE) {
public function getSizes($product_id) {
} // end function
}// end if
} // end class
会引发错误问题。但我需要这个功能。
我想在此类中使用function_exists,或者强制重新声明该方法。
如何让function_exists在类中工作?
答案 0 :(得分:3)
你不能在一个方法之外的类中拥有可执行代码,所以你无法做你所要求的,因为你的if()
条件需要在类体中。
所以尽管其他人在说什么,method_exists()
并不是这个问题的合适答案。
如果您收到错误声明该方法已被声明,那么可能有以下几种原因:
它实际上已经在同一个类的其他地方声明了。在这种情况下,当然你不能重新声明它。但是因为类的代码应该都在一个文件中,所以应该很容易看到并避免这样做。
它在父类中声明(即在您的情况下Model
或其父母之一)。
在正常情况下,您应该能够重新声明已在父类中声明的方法;您的方法将覆盖父类中相同名称的方法。因此,对于大多数情况,您的整个问题完全没必要。
但是你说你得到了错误,所以显然出现了问题如果你告诉我们确切的错误信息会有所帮助,但我有两个原因可以认为这可能不起作用:
如果父类中的方法声明为Final
,则表示父类的作者明确不希望它被覆盖。这意味着您不能拥有自己的同名方法。
如果父类中的方法具有不同的签名 - 例如,父级中的private
,而班级中的public
,或者static
中的一个,但不是另外,那么你会得到错误抱怨。在这种情况下,您需要确保方法具有相同的签名,否则为您的方法指定不同的名称。
希望有所帮助。
答案 1 :(得分:0)
@Spudley的答案被正确选择为正确的答案。
仅对答案中提到的第一种情况进行更多解释:如果要在类的方法内部声明函数,则还应该考虑类的名称空间:
class MyClass
{
function myFunction()
{
//here, check if the function is defined in the root namespace globally
// or in the current namespace:
if(!function_exists('someFunction')
&& !function_exists(__NAMESPACE__ . '\someFunction'))
{
function someFunction()
{
}
}
//....
someFunction();
}
}
如果不检查if的第二个条件,则多次调用myFunction()会引发异常