Доступ к расширенному классу из родительского класса в PHP

У меня есть два класса, класс A и класс B, я пытаюсь получить доступ к классу B через функцию в классе A.

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

Вот пример того, что я хотел бы сделать:

class a{

    function a(){
        return $this->b();
    }


}

class b extends a{

    function b(){
        return "It Works!";
    }

}

$doIt = new a();
echo $doIt->a();

Это не работает таким образом. Вы не можете создать экземпляр A и получить доступ к методам B. Вы можете создать экземпляр B и получить доступ к методам в A.

Halfstop 10.02.2019 23:21

поэтому создание экземпляра B из A - единственный вариант?

K.D 10.02.2019 23:23

Почему вы пытаетесь это сделать? Какова твоя цель? Возможно, мы могли бы предложить лучший способ сделать это? Способ, который вы предложили, кажется, ломает модель oop.

user10957435 10.02.2019 23:25

Ну, А не знает о В, но Б знает об А. Вы можете использовать А, но он ничего не знает о В.

Halfstop 10.02.2019 23:25

В основном у меня есть класс B, который работает с базой данных, и класс A, который связывает действия пользователей на сайте с классом B. Таким образом, пользователь что-то делает-> класс A начинает работать-> передает информацию классу B для добавления в базу данных. Казалось, что это не так уж и возможно, но я знаю, что есть люди с гораздо большими знаниями, чем у меня, поэтому я хотел узнать, знает ли кто-нибудь еще какой-нибудь способ сделать это.

K.D 10.02.2019 23:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
243
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не можете. Но вы можете ожидать абстрактный метод.

abstract class a {
    function a() {
        return $this->b(); // OK
    }
    abstract function b(); // Has no method body. Classes extending this class will implement it
}
class b extends a {
    function b() {
        return 'something';
    }
}
$doIt = new b(); // Cannot instantiate abstract class a
echo $doIt->a();

Это эквивалент виртуальной функции С++?

user10957435 10.02.2019 23:26

Нет, это скорее эквивалент чистой виртуальной функции C++. Если не использовать final, все функции по умолчанию эквивалентны виртуальным функциям C++.

Ulrich Eckhardt 10.02.2019 23:28

Например, int method() = 0; Попался. Очень круто. Полезно знать, что все методы php действуют как виртуальные функции.

user10957435 10.02.2019 23:29
Ответ принят как подходящий

Из вашего комментария:

Basically i have class B that works with the database, and class A that connects the users actions on the site to class B. So user does something->class A starts working->Passes info on to class B to add to the database. It did seem that this is not all that possible, but i know there are people with a lot more knowledge than I have so i wanted to see if anyone else knew of some way to do this.

Как вы описываете: B работает с базой данных, A выполняет действия (запрошенные пользователем). B звучит как какой-то объект сопоставления/доступа к данным, а A звучит как служба (я буду ссылаться на BMapper и AService, чтобы быть более преднамеренным).

То, что вы изложили, указывает на то, что вы неправильно используете наследование PHP. Наследование представляет отношения «является». (Image — это Media, PathMover — это Animator и т. д.). Хотя ответ @Malcolm технически работает, он не для вашего сценария.

В ООП мы бы сказали, что BMapper является зависимостью от AService. Таким образом, всякий раз, когда мы вызываем метод в AService, мы ожидаем, что он будет зависеть от экземпляра BMapper. Это отношение обычно выполняется через внедрение зависимости (см.: Что такое внедрение зависимостей?).

<?php

class AService {

    private $bMapper;

    public function __construct(BMapper $bMapper)
    {
        $this->bMapper = $bMapper;
    }

    public function doAction()
    {
        return $this->bMapper->performSomethingInDatabase();
    }

}

class BMapper {

    public function performSomethingInDatabase()
    {
        /**
         * ..whatever
         */
    }

}

$service = new AService(new BMapper);
$service->doAction();

Вы можете видеть, что мы определили зависимость нашего зависимого класса в его конструкторе, чтобы быть удовлетворенным тем, кто/что бы ни использовало этот класс.

Проголосовали за то, что показали, что композиция объектов — это то, что нужно.

Major Productions 11.02.2019 04:24

Другие вопросы по теме