Правильное подключение классов в PHP

243
05 мая 2018, 15:35

Всем привет, учу ООП в PHP и столкнулся с проблемой правильного подключение классов. У меня есть форма регистрации в html файле, данные с которой обрабатываются php скриптами. У меня есть один родительский класс и несколько дочерних, все они в разных файлах. Я хочу автоматически подгружать все дочерние классы в родительский.

Вот мой родительский класс в котором я инициализирую объект дочернего.

<?php
spl_autoload_register(function ($class) { /*подгржаю дочерний класс*/
    include $class . '.php';
});
$addTxt = new AddTxt(); /*инициализарую объект дочернего класса*/
class Validator {
    public $name  = 'name ';
    public $s_name  = 's_name ';
    public $email = 'email ';
    public $ticket = 'ticket ';
    function __construct(){
        $this->name = $_POST['name'];
        $this->s_name = $_POST['s_name'];
        $this->email = $_POST['email'];
        $this->ticket = $_POST['ticket'];
    }
}
$validate = new Validator();

А вот, собственно, и дочерний класс

<?php
class AddTxt extends Validator {
    public $string = "test";
    public $file;
    public $date;
    function __construct(){
        parent::__construct();
        $this->date = date('d_m_Y');
        $this->file = 'registration_' . $this->date . ".txt";
        $this->string = $this->name . " " . $this->s_name . " " . $this->email . " " . $this->ticket . PHP_EOL;
    }
    function addLine(){
        if(file_exists($this->file)){
            $f = fopen($this->file, "a+") or die ("Error");
            if (($f) && filesize($this->file)) {
                $lines = explode("\n", fread($f, filesize($this->file)));
                foreach($lines as $line){
                    $l = explode(" ", $line);
                    $line_items[] = $l[2];
                }
                foreach ($line_items as $item) {
                    if($item === $this->email) {
                        die ("Такой email уже существует");
                    }
                }
                fwrite($f, $this->string);
            }
            else {
                fwrite($f, $this->string);
            }
            fclose($f);
        }
        if(!file_exists($this->file)) {
            $f = fopen($this->file, "a+") or die ("Error");
            fwrite($f, $this->string);
            fclose($f);
        }
    }
}

$addTxt = new AddTxt();/*повторная инициализация объекта дочернего класса*/
$addTxt->addLine()

Как видно, объект дочернего класс инициализирован дважды, иначе я получаю вот такую ошибку Call to a member function addLine() on a non-object, то есть, будто я не создал объект. Мне кажется, что это неверный способ. Я хочу инициализировать объект только один раз. Подскажите как правильно подключение классов?

Answer 1

В вашем подключении дочернего класса к родительскому, нет никакого смысла, потому что родительский класс как таковой не требует дочернего, а вот дочернему классу обязательно надо подключить родительский, ибо где он его возьмёт если вы его не подключили? Соотвественно и реализовывать дочерний класс в файле с родительским, не трубеться, также судя по коду который вы скинули, вам и родитеслкий класс реализовывать в его файле, не требуется. Также я советую вам прочитать про composer autoload И PSR-4, они упрощает работу с автозагрузкой классов в целом.

READ ALSO
Проблема с настройкой сервера под PHP

Проблема с настройкой сервера под PHP

Установил Open Server для работы с PHPНастройки:

221
Как избежать race condition при переводе

Как избежать race condition при переводе

Например, нужно сделать трансфер от одного пользователя на другой:

214
Работа с Bitcoin Core через PHP

Работа с Bitcoin Core через PHP

не могли бы вы подсказать какие-либо материалы, в которых описано взаимодействие с кошельком Bitcoin Core средствами PHP(Необходимо для организации...

233