当前位置: 首页 > 编程笔记 >

PHP 抽象类

诸福
2023-03-14
本文向大家介绍PHP 抽象类,包括了PHP 抽象类的使用技巧和注意事项,需要的朋友参考一下

示例

抽象类是无法实例化的类。抽象类可以定义抽象方法,这些方法没有任何主体,只有一个定义:

abstract class MyAbstractClass {
    abstract public function doSomething($a, $b);
}

应该通过子类扩展抽象类,然后可以提供这些抽象方法的实现。

这样的类的主要目的是提供一种模板,该模板允许子类继承,“强制”遵循的结构。让我们用一个例子来详细说明一下:

在此示例中,我们将实现一个Worker接口。首先我们定义接口:

interface Worker {
    public function run();
}

为了简化进一步的Worker实现的开发,我们将创建一个抽象worker类,该类已经run()从接口提供了方法,但是指定了一些子类必须填充的抽象方法:

abstract class AbstractWorker implements Worker {
    protected $pdo;
    protected $logger;

    public function __construct(PDO $pdo, Logger $logger) {
        $this->pdo = $pdo;
        $this->logger = $logger;
    }

    public function run() {
        try {
            $this->setMemoryLimit($this->getMemoryLimit());
            $this->logger->log("Preparing main");
            $this->prepareMain();
            $this->logger->log("Executing main");
            $this->main();
        } catch (Throwable $e) {
            // 捕获并重新抛出所有错误,以便工人可以记录下来
            $this->logger->log("Worker failed with exception: {$e->getMessage()}");
            throw $e;
        }
    }

    private function setMemoryLimit($memoryLimit) {
        ini_set('memory_limit', $memoryLimit);
        $this->logger->log("Set memory limit to $memoryLimit");
    }

    abstract protected function getMemoryLimit();

    abstract protected function prepareMain();

    abstract protected function main();
}

首先,我们提供了一种抽象方法getMemoryLimit()。从扩展的任何类都AbstractWorker需要提供此方法并返回其内存限制。在AbstractWorker随后将内存限制,并记录它。

其次,在记录已调用之后,AbstractWorker调用prepareMain()和main()方法。

最后,所有这些方法调用都分组在try-catch块中。因此,如果子类定义的任何抽象方法抛出异常,我们将捕获该异常,将其记录并重新抛出。这样可以避免所有子类都必须自己实现。

现在让我们定义一个继承自的子类AbstractWorker:

class TranscactionProcessorWorker extends AbstractWorker {
    private $transactions;

    protected function getMemoryLimit() {
        return "512M";
    }

    protected function prepareMain() {
        $stmt = $this->pdo->query("SELECT * FROM transactions WHERE processed = 0 LIMIT 500");
        $stmt->execute();
        $this->transactions = $stmt->fetchAll();
    }

    protected function main() {
        foreach ($this->transactions as $transaction) {
            // 可能引发一些PDO或MYSQL异常,但这由AbstractWorker处理
            $stmt = $this->pdo->query("UPDATE transactions SET processed = 1 WHERE id = {$transaction['id']} LIMIT 1");
            $stmt->execute();
        }
    }
}

如您所见,它TransactionProcessorWorker非常容易实现,因为我们只需要指定内存限制并担心它需要执行的实际操作。不需要进行错误处理,TransactionProcessorWorker因为该错误是在中处理的AbsractWorker。

重要的提示

从抽象类继承时,父类声明中标记为抽象的所有方法都必须由子代定义(或者子代本身也必须标记为抽象);此外,必须以相同(或较少限制)的可见性定义这些方法。例如,如果抽象方法定义为protected,则函数实现必须定义为protected或public,但不能定义为private。

摘自用于类抽象的PHP文档。

如果在子类中定义父抽象类方法,则将引发致命PHP错误,如下所示。

致命错误:类X包含1抽象方法,因此必须声明为抽象,或在其中实现其余方法(X :: x)

 类似资料:
  • 本文向大家介绍php中的抽象方法和抽象类,包括了php中的抽象方法和抽象类的使用技巧和注意事项,需要的朋友参考一下 1、什么是抽象方法? 我们在类里面定义的没有方法提的方法就是抽象方法。所谓的没有方法体指的是,在声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时方法还要加一个关键字"abstract"来修饰。 例如: 2、什么是抽象类? 只要一个类里面

  • 本文向大家介绍php导出CSV抽象类实例,包括了php导出CSV抽象类实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php导出CSV抽象类及其应用,分享给大家供大家参考。具体分析如下: 该php导出CSV抽象类,可根据总记录数与每批次记录数,计算总批次,循环导出。避免内存不足的问题。 ExportCSV.class.php类文件如下: demo示例程序如下: 完整实例代码点击此处本站

  • 问题内容: 什么是PHP中的抽象类? 如何使用? 问题答案: 抽象类是至少包含一个抽象方法的类,该方法中没有任何实际代码,只是名称和参数,并且已标记为“抽象”。 这样做的目的是提供一种模板,以从其继承并强制继承类实现抽象方法。 因此,抽象类介于常规类和纯接口之间。接口也是抽象类的特殊情况,其中所有方法都是抽象的。 有关更多参考,请参见PHP手册的这一部分。

  • 本文向大家介绍详解PHP的抽象类和抽象方法以及接口总结,包括了详解PHP的抽象类和抽象方法以及接口总结的使用技巧和注意事项,需要的朋友参考一下 PHP中的抽象类和抽象方法自己用的不多,但是经常会在项目中看到别人使用,同样,今天在看别人的代码的时候,发现使用了抽象类,就总结下: 抽象类: 1、如果一个类中有一个方法是抽象方法,则这个类就是抽象类; 2、抽象类必须加上abstract关键字修饰; 抽象

  • 本文向大家介绍PHP抽象类基本用法示例,包括了PHP抽象类基本用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP抽象类基本用法。分享给大家供大家参考,具体如下: 运行上述代码,会提示如下错误信息: Fatal error: Class Managers contains 1 abstract method and must therefore be declared abstr

  • 我想读关于抽象的文章,但读到不同的文章,我感到很困惑。 下面是我无法理解的问题: 1)“抽象是通过使用抽象类和接口实现的吗?”我对此进行了搜索,得到了三种类型的答案: 与此处解释的不同。 它们是相同的,只是不同的观点,就像这里解释的。 最后一个是抽象类用来实现抽象。 哪一个是真的?请举一个简单的例子。 2)“抽象意味着隐藏不必要的细节。比如专注于一个对象做什么而不是它是如何完成的。” 这是正确的吗