1

I am using OpenCart and installed the module sizes.xml, it edits the catalog/product/model/catalog/product.php file

It adds a class method;

I have an issue with some code where in a function I have:

class ModelCatalogProduct extends Model {

    public function getSizes($product_id) { 
      ...
    } // end function

} // end class

We always get an error saying that we cannot redeclare getSizes method.

I want to either force redeclaration, or alternatively check whether the function exists before calling the method but I cannot use function_exists in a class.

ie, this seems illegal;

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

It will throw up an error issue. But I need the function in there.

I would like to use function_exists in this class or alternatively force the method to be redeclared.

How would I make function_exists work inside a class?

4

2 回答 2

4

您不能在方法之外的类中拥有可执行代码,因此您无法按照您的要求进行操作,因为您的if()条件需要在类主体中。

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

如果您收到一条错误消息,指出该方法已声明,那么可能有以下几个原因:

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

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

    一般情况下,你应该可以重新声明一个已经在父类中声明的方法;您的方法将覆盖父类中的同名方法。所以在大多数情况下,你的整个问题是完全没有必要的。

    但是您说您遇到了错误,因此很明显出了点问题如果您告诉我们确切的错误消息会有所帮助,但是我认为这可能行不通的原因有两个:

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

    • 如果父类中的方法具有不同的签名 - 例如它private在父类中但public在您的类中,或者static在一个但不在另一个中,那么您将收到抱怨的错误。在这种情况下,您需要确保这些方法具有相同的签名,或者给您的方法一个不同的名称。

希望有帮助。

于 2013-05-30T09:29:36.527 回答
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() 会抛出异常

于 2019-09-16T04:49:43.123 回答