Наследование: не могу найти родителя - PullRequest
0 голосов
/ 26 апреля 2018

Я ломал голову над этим в течение нескольких часов, и я не могу понять, почему это не работает. У меня есть два класса php

<?php
class Mother
{
    public function __construct()
    { }
}

И детский класс.

<?php
require_once('Mother.php');
class Child extends Mother
{
    public function __construct()
    {
        parent::__construct();
    }
}

Эти классы находятся в отдельных файлах, и я значительно упростил их для этого примера.

Согласно тому, что я знаю и что я нашел в нескольких других вопросах о SO, это должно работать нормально. Но я получаю эту ошибку:

Неустранимая ошибка: класс 'Мать' не найден в маршруте к дочернему классу в строке 4

Какие-нибудь решения или идеи, где я должен продолжать искать?

РЕДАКТИРОВАТЬ: оба файла находятся в одной папке

EDIT: добавлена ​​отладка перед объявлением класса Файл вызывается 4 раза и 3 раза из тех, что присутствует в классе Матери все же один раз это не приводит к фатальной ошибке (хотя к тому времени, когда я использую дочерний класс, класс Матери присутствует)

РЕДАКТИРОВАТЬ: сейчас я только что удалил расширение и поместил унаследованные функции в дочерний класс, чтобы я мог продолжать работать. Я опубликую решение, когда найду его.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

проблема в вашем require_once заявлении

вы используете относительный адрес, который кажется правильным, но на самом деле он относится к файлу, с которым сервер связался, а не к дочернему классу

при условии корень / index.php

Require_once "Child.php"

и при условии корень / классы / Child.php

Require_once "Parent.php"

в этом случае он будет искать родителя в папке root, а не в папке classes

у вас есть 2 варианта 1 используйте переменную __DIR__

т.е.

Require_once __DIR__ . "/Parent.php"

это заставит пользователя использовать папку, в которой находится файл, а не папку, в которой находится исходный вызов

другой вариант - использовать автозагрузчик который выглядел бы так

<?php
    spl_autoload_register(function ($class) {
        $fname = __DIR__ . '/classes/' . $class . '.php';
        if(file_exists($fname))
        {
            include_once($fname);
        }
    })

?>

это затем даст команду php искать любые неизвестные классы в папке классов и загружать их в систему

0 голосов
/ 26 апреля 2018

ваш код правильный, но ваш
require_once ('Mother.php');
не включает в себя класс вашей матери. Убедитесь, что они находятся в одной папке, или добавьте путь к require_once.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...