在类中使用PHP function_exists?

时间:2013-05-30 09:17:57

标签: php class function

我正在使用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在类中工作?

2 个答案:

答案 0 :(得分:3)

你不能在一个方法之外的类中拥有可执行代码,所以你无法做你所要求的,因为你的if()条件需要在类体中。

所以尽管其他人在说什么,method_exists()并不是这个问题的合适答案。

如果您收到错误声明该方法已被声明,那么可能有以下几种原因:

  1. 它实际上已经在同一个类的其他地方声明了。在这种情况下,当然你不能重新声明它。但是因为类的代码应该都在一个文件中,所以应该很容易看到并避免这样做。

  2. 它在父类中声明(即在您的情况下Model或其父母之一)。

    在正常情况下,您应该能够重新声明已在父类中声明的方法;您的方法将覆盖父类中相同名称的方法。因此,对于大多数情况,您的整个问题完全没必要。

    但是你说你得到了错误,所以显然出现了问题如果你告诉我们确切的错误信息会有所帮助,但我有两个原因可以认为这可能不起作用:

    • 如果父类中的方法声明为Final,则表示父类的作者明确不希望它被覆盖。这意味着您不能拥有自己的同名方法。

    • 如果父类中的方法具有不同的签名 - 例如,父级中的private,而班级中的public,或者static中的一个,但不是另外,那么你会得到错误抱怨。在这种情况下,您需要确保方法具有相同的签名,否则为您的方法指定不同的名称。

  3. 希望有所帮助。

答案 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()会引发异常