PHP - вызов метода из класса, в котором я создал экземпляр своего объекта

У меня есть 2 класса, объявленных, как в примере ниже.

class A{
   protected $process;

   public function __construct() {
      ......
      $this->process=new B();

   }

   public function do_something(){
     ....
   }

}

class B{
 // content not important
 // I need to call do_something from class A     

}

Мой вопрос в том, как я могу вызвать из класса B метод do_something() из класса A? Является ли это возможным?

Либо создайте B и расширение A, либо создайте новый объект A внутри B и вызовите этот метод.

Qirel 25.02.2019 11:49

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

Karsten Koop 25.02.2019 11:56
$this->process = new B($this);, сохраните его в конструкторе B, назовите то, что вам нужно.
Yoshi 25.02.2019 11:58

Вы пробовали что-нибудь, чтобы заставить это работать?

Nico Haase 25.02.2019 12:05
Стоит ли изучать 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
4
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Из вашего примера невозможно, например, B узнать, что он создан и сохранен экземпляром класса A. Вам нужно каким-то образом явно создать это соединение.

Я даже не думал, что это сработает, но, видимо, вы можете передать экземпляр A в B до того, как A будет выполнен с его конструктором:

class A {
    protected $process;

    public function __construct() {
        $this->process = new B( $this );

    }

    public function do_something() {
        var_dump( 'do_something' );
    }

    public function test() {
        $this->process->test();
    }
}

class B {

    public function __construct( A $a ) {
        $this->a = $a;
    }

    public function test() {
        $this->a->do_something();
    }
}

$a = new A();

$a->test(); // do_something

Трудно дать совет, какой подход лучше всего подходит для вашего конкретного случая, поскольку мы не знаем, что делает ни A, ни B.

Есть несколько способов добиться этого. Одним из способов было бы сделать B и расширение A, тем самым позволив всем методам класса A быть вызываемыми для объекта B. Другой способ — создать новый объект A внутри B и вызвать этот метод. Или вы можете пройти

Вот пример, где B расширяется от A. При этом все свойства и методы A могут быть вызваны в B, если только они не перезаписаны в B.

class A {
    public function doSomething(){
        echo "doSomething() called in A";
    }

}
class B extends A {
    public function someMethod() {
        $this->doSomething();
    }
}

$b = new B();
$b->someMethod();

Приведенное выше выведет doSomething() called in A.

Или вы можете создать объект A и вызвать этот метод внутри B.

class B {
    public function someMethod() {
        $a = new A();
        $a->do_something();
    }
}
$b = new B();
$b->someMethod();

Прочитав все ответы и проведя некоторые исследования, я думаю, что лучшим методом для меня было использование черт.

«Черты — это механизм повторного использования кода в языках одиночного наследования, таких как PHP. Черта предназначена для уменьшения некоторых ограничений одиночного наследования, позволяя разработчику свободно повторно использовать наборы методов в нескольких независимых классах, живущих в разных иерархиях классов».

Итак, я объявил Trait с методом do_something и вызвал этот метод как из класса A, так и из класса B.

Спасибо

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