Какой лучший способ обратиться к методам создания объекта?

Итак, я создал простое воссоздание проблемы, с которой столкнулся, и я проверил код, и он работает. Моя проблема в том, как вызывать 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 в мб

1

Решение

Я бы сделал внедрение конструктора вместо внедрения метода, как вы это делаете в настоящее время, см. Ниже:

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 — он есть, если вам это нужно.

Между прочим, все объекты передаются по ссылке автоматически, но это не касается подхода с использованием конструктора.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]