Итак, я создал простое воссоздание проблемы, с которой столкнулся, и я проверил код, и он работает. Моя проблема в том, как вызывать Paper-> Important () из Rock-> mb (), когда экземпляр rock находится внутри экземпляра paper, не вводя экземпляр объекта в каждый метод? Я сделал это, передав / введя $ this моей бумаги в методы рока. Основная проблема заключается в том, что только один метод рок требует этого, так как я могу легко получить доступ к методам экземпляра объекта, не передавая их каждой функции, учитывая, что у меня много функций? Последний вопрос, возможно, это вообще имеет значение что я ввел их в каждый метод, будет ли использовать дополнительную память или ресурсы? Должен ли я передать $ this по ссылке?, это спасет память? Кроме того, что происходит, когда я передаю дополнительные аргументы, которые не используются?
<?php
class Rock{
public function ma($args){ //what happens when it gets injected into this function?
return $args." in ma";
}
public function mb($args,$context){ //do I have to inject it?
if($args=="args2"){
$context->important();
return "<br>".$args." in mb";
}
}
//50 other functions that DONT require paper->important()
}
class Paper{
public function __construct($vitalString){
$this->vitalString = $vitalString;
}
public function all(){
$list = ['ma'=>'args1','mb'=>'args2'];
$objRock = new Rock();
foreach($list as $meth=>$args){
if(method_exists($objRock,$meth)){
$response = $objRock->{$meth}($args,$this);
//can I avoid injecting the instantiating $this, into every function I call if only one needs it?
echo $response;
}
}
}
function important(){
echo "<br>".$this->vitalString;
}
}
$myPaper = new Paper("Super Duper");
$myPaper->all();
?>
Вот вывод
args1 в ма
супер-пупер
args2 в мб
Я бы сделал внедрение конструктора вместо внедрения метода, как вы это делаете в настоящее время, см. Ниже:
class Rock{
private $paper;
public function __construct($paper){
$this->paper = $paper;
}
public function ma($args){
return $args." in ma";
}
public function mb($args){ //do I have to inject it?
if($args=="args2"){
$this->paper->important();
return "<br>".$args." in mb";
}
}
//50 other functions that DONT require paper->important()
}
В методе mb я изменил ваш звонок с
$context->important();
в
$this->paper->important();
Класс бумаги теперь выглядит следующим образом:
class Paper{
public function __construct($vitalString){
$this->vitalString = $vitalString;
}
public function all(){
$list = ['ma'=>'args1','mb'=>'args2'];
$objRock = new Rock($this); //<-------------------
foreach($list as $meth=>$args){
if(method_exists($objRock,$meth)){
$response = $objRock->{$meth}($args); //<-----------------
//can I avoid injecting the instantiating $this, into every function I call if only one needs it?
echo $response;
}
}
}
function important(){
echo "<br>".$this->vitalString;
}
}
С внедрением конструктора вы можете использовать внедренный класс где угодно, не беспокоясь о том, чтобы передавать его в каждый метод, даже если метод не нуждается в нем. (Также непонятно наличие функций с аргументами, которые никогда не используются.) Если у класса paper нет тонны свойств, содержащих астрономический объем данных, вам не нужно беспокоиться о проблемах с памятью.
Подход с использованием конструктора также удобен на тот случай, если вы решите добавить дополнительные методы, которые требуют использования класса paper — он есть, если вам это нужно.
Между прочим, все объекты передаются по ссылке автоматически, но это не касается подхода с использованием конструктора.
Других решений пока нет …