类在另一个类中调用一个函数

时间:2009-11-06 10:46:52

标签: php oop

我有一个类:

<?PHP

abstract class dbCon
{
    public function OpenConnection()
    {
          // Do Something;
          // On error:
          $this->ShowError();
    }
    abstract function ShowError();
}

class ErrorHandling extends dbCon
{
    public function ShowError()
    {
        // Show error
    }
}
?>

上述代码存在缺陷。我想从抽象类中调用ShowError(),但它是接口定义的地方。如何处理?

3 个答案:

答案 0 :(得分:3)

你将继承与委托混为一谈。 ErrorHandler应该是dbCon的委托。

确定A类是否应该是B的子类的一种有用方法是问自己是否说“A是比B更具体的东西”。也就是说,A是否至少 B的所有基本属性和行为。这是真实的例子,也不是:

  1. TRUE:美洲狮是猫的类型。

    • FALSE:主干类型的汽车。
    • FALSE:律师类型的唱片公司执行官。
  2. 在案例2中,卡车是汽车的部分,因此建模的正确方法是通过组合;有一个Car对象,然后可以包含对Trunk对象的引用。

    在案例3中,律师是唱片公司执行官的代表;建立此模型的正确方法是让您的RLExective对象持有对其知道的一个或多个律师的引用,并在需要时让RLExecutive在任何一位律师上调用SueCollegeStudentOrGrandmother()方法。

    在此层次结构中,您说ErrorHandler 是dbCon的类型。这没有任何意义。更确切地说,ErrorHandler是dbCon的委托,负责处理错误。在这种情况下,您可能需要一个自由浮动的ErrorHandler对象,或者可能需要具有有关DB错误的特定知识的对象。每当dbCon收到它想要显示的错误时,它会通过ShowError()方法将错误抛出到ErrorHandler。

    根据您的评论,您的混淆似乎在于 extends 的含义。通过说ErrorHandler extends dbCon,您已经说过ErrorHandler是dbCon的子类,而不是ErrorHandler为dbCon添加了额外的功能。这意味着您必须创建一个ErrorHandler实例,它将具有dbCon ErrorHandler的功能。这可能不是你想要的。

    希望这是有道理的。

答案 1 :(得分:1)

您可以实现自己的例外处理程序

class Exception_Handler extends Exception {
    ...
}

class DB_Connection {
    try {
        throw new Exception_Handler('Cannot connect to DB: ' . $exception->getMessage() . '.');
    } catch (Exception_Handler $exception) { $exception->show(); }
}

更多相关信息:http://www.w3schools.com/php/php_exception.asp

答案 2 :(得分:0)

我建议你阅读Polymorphism

从父类调用ShowError()将由实例的类确定,这在运行时完成。

为了演示,请考虑以下代码:

<?PHP

abstract class dbCon {
    public function OpenConnection() {
          // Do Something;
          // On error:
          $this->ShowError();
    }
    abstract function ShowError();
}

class ErrorHandling extends dbCon {
    public function ShowError() {
        // Show error
        echo "Error is here\n";
    }
}
class WarningHandling extends dbCon {
    public function ShowError() {
        // Show waring
        echo "Warning is here\n";
    }
}

$ErrorHandling = new ErrorHandling();
$ErrorHandling->OpenConnection();

$WarningHandling = new WarningHandling();
$WarningHandling->OpenConnection();

?>

运行时,您将获得:

Error is here
Warning is here

为什么?

因为,第一个ShowError()来自ErrorHandling类型的对象。 PHP发现该对象来自具体类型ErrorHandling,因此当从ShowError()调用OpenConnection时,php使用对象类型(ErrorHandling)中的函数。

第二个ShowError()调用来自WarningHandling的对象,因此PHP正在使用ShowError()的{​​{1}}。

仔细看看Polymorphism。多态性是OOP最重要的概念之一(因为它只是基于对象的一个​​缺失)。

希望这有帮助。