У меня есть 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? Является ли это возможным?
Мы действительно недостаточно знаем об общей архитектуре, но даем рекомендацию. Вы хотите вызвать метод экземпляра A, в котором содержится этот экземпляр B? В этом случае вы можете передать экземпляр A конструктору B и сохранить его в переменной-члене, чтобы позже вызвать его метод.
$this->process = new B($this);, сохраните его в конструкторе B, назовите то, что вам нужно.
Вы пробовали что-нибудь, чтобы заставить это работать?






Из вашего примера невозможно, например, 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.
Спасибо
Либо создайте
Bи расширениеA, либо создайте новый объектAвнутриBи вызовите этот метод.