@inkyrein
Начинаю постигать WEB-программирование

Зачем нужен final class?

Привет всем.
Подскажите пожалуйста, зачем нужны final class? Методы я понимаю зачем делать final - что бы их не переопределяли. А вот классы от которых нельзя наследоваться зачем делать? Я так понимаю просто весят тогда ненужные сущьности? Или я ошибаюсь? Подскажите пожалуйста, и если можно примеры где это использовать.
  • Вопрос задан
  • 3455 просмотров
Пригласить эксперта
Ответы на вопрос 3
@dev400
Я использую в классе соединения с бд, тк нет смысла наследовать этот класс. Подключение инициализируется и дальше работа идет в моделях
<?php
namespace app\Common\Mysql;

final class Connection
{

    protected $link;

    public function __construct() {

        if ( is_null($this->link) ) {
            try {
                $attr  = [
                    \PDO::ATTR_ERRMODE  =>  \PDO::ERRMODE_EXCEPTION,
                    \PDO::ATTR_DEFAULT_FETCH_MODE   =>  \PDO::FETCH_ASSOC
                ];

                $this->link = new \PDO("mysql:host=localhost;dbname=dbname;charset=utf8", "user", "pass", $attr);

            } catch (\PDOException $e) {
                file_put_contents('log.txt', $e->getMessage(), FILE_APPEND);
            }
        }
    }

    /**
     *  @return \PDO;
     */
    public function link() {
        return $this->link;
    }
}


update

<?php
namespace app\Common\Model;

use app\Common\Mysql\Connection;

abstract class BaseModel {

    private $connection;

    /**
     * prefix for tables
     */
    const PREFIX =  "";

    /**
     * @var
     */
    protected $table;

    /**
     * @var
     */
    protected $key;

    public function __construct(Connection $conn) {

        $this->connection = $conn->link();

    }

    public function findAll() {

        return $this->fetch( "SELECT * FROM " . self::PREFIX . $this->table );

    }

    /**
     * @param array $args
     * @param $sql
     * @return array|string
     */
    public function findBy(Array $args, $sql) {

        $stmt = $this->connection->prepare($sql);
        $data = "";
        if ( $stmt->execute($args) ) {
            while ($row = $stmt->fetch()) {
               $data[] = $row;
            }
        }
        return $data;

    }


    /**
     * @param $query
     * @return mixed
     */
    protected function fetch($query) {

        $stmt = $this->connection->query($query);
        $stmt->setFetchMode(\PDO::FETCH_ASSOC);
        $data = "";
        while ( $row = $stmt->fetch() ) {
            $data[] = $row;
        }
        return $data;

    }

    protected function save(Array $array, $sql) {

        $sth = $this->connection->prepare($sql);
        return $sth->execute($array);

    }

    protected function deleteById($id) {
        $id = (int)$id;
        return $this->connection->exec('DELETE FROM ' . self::PREFIX . $this->table . ' WHERE id = '.$id.'');
    }

}
Ответ написан
prototype_denis
@prototype_denis
Symfony
class Foo
{
    const FOO_CONSTANT = 'foo';
}
class Bar extends Foo
{
    const FOO_CONSTANT = 'bar';
}
var_dump(Bar::FOO_CONSTANT); // bar



final class Biz
{
    const BIZ_CONSTANT = 'biz';
} 
// PHP Fatal error:  Class Baz may not inherit from final class (Biz)
// class Baz extends Biz {
//         
// }
Ответ написан
@AlikDex
Не из мира пхп, но все же. Вот так без слова final в ключевых для безопасности классах работают вирусы:
https://habrahabr.ru/post/235713/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
10 мая 2021, в 10:21
80000 руб./за проект
10 мая 2021, в 10:12
35000 руб./за проект
10 мая 2021, в 10:03
3000 руб./за проект