Всем привет, учу ООП в 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
, то есть, будто я не создал объект.
Мне кажется, что это неверный способ. Я хочу инициализировать объект только один раз.
Подскажите как правильно подключение классов?
В вашем подключении дочернего класса к родительскому, нет никакого смысла, потому что родительский класс как таковой не требует дочернего, а вот дочернему классу обязательно надо подключить родительский, ибо где он его возьмёт если вы его не подключили? Соотвественно и реализовывать дочерний класс в файле с родительским, не трубеться, также судя по коду который вы скинули, вам и родитеслкий класс реализовывать в его файле, не требуется. Также я советую вам прочитать про composer autoload
И PSR-4
, они упрощает работу с автозагрузкой классов в целом.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Например, нужно сделать трансфер от одного пользователя на другой:
не могли бы вы подсказать какие-либо материалы, в которых описано взаимодействие с кошельком Bitcoin Core средствами PHP(Необходимо для организации...