Я знаю, как вызвать функцию на основе такой переменной:
$platform->ConfigurePlatform($client);
Где $platform - это переменная, содержащая имя класса.
Я пытаюсь вызвать такую функцию, но объект, основанный на том же классе. Приведенное ниже будет работать нормально, что подходит для того же метода.
$platform = new $platform_name();
$platform->ConfigurePlatform($client);
Но я хочу вызвать другой метод внутри объекта, например:
$this->$platform->GetOrdersFromPlatform();
Это приведет к ошибке ниже:
Fatal error: Cannot access empty property (On the line above)
Я подумал, может, мне стоит вместо этого создать такой объект:
$this->$platform = new $platform_name();
Однако это дает ошибку ниже:
Fatal error: Cannot access empty property (On the line above)
Как я могу этого добиться?
Спасибо, но такая же ошибка.
Почему вы используете $this? Разве это не должно быть просто $platform->GetOrdersFromPlatform();?
какая у вас версия php?
И если вы хотите создать экземпляр класса, то это должно быть: $platform=, а не $this->$platform.
@simon Пропустил это исключено, когда я это делаю, я получаю Fatal error: Call to a member function GetOrdersFromPlatform() on a non-object
@ErisanOlasheni Вот что я делаю. 5.3.1
Вы должны использовать фабрику шаблонов проектирования phptherightway.com/pages/Design-Patterns.html
Я понял, что делаю неправильно. Я понятия не имею, почему я пытаюсь установить имя объекта как переменное. Просто сделать $this->platform = new $platform_name(); подойдет для моих нужд. Просто я не буду знать названия каждой платформы, так как они будут закодированы другими позже.
Я неправильно понял вопрос, думаю, теперь понял. Вы хотите, чтобы объектная платформа, которая использовалась где-то еще, по-прежнему использовалась в том же объекте, не так ли?
Да это оно. Я все еще учусь, поэтому немного борюсь с терминологией.
Не волнуйтесь, бывает. Если вы знаете, что собираетесь использовать экземпляр другого объекта для нескольких операций, вам обязательно следует подумать о добавлении его в атрибут исходного класса ... таким образом, вы можете продолжать выполнять операции с ним, не теряя ссылку. Это очень стандартная практика в ООП.






Ваш вопрос не ясен, но я думаю, что вам нужно объединение методов, это можно сделать, вернув свойство класса $this. Пример:
class ClassName
{
function ConfigurePlatform($client)
{
// What to do
echo __METHOD__.": ".$client."\n";
// return the $this property to make the class properties chainable
return $this;
}
function GetOrdersFromPlatform($client)
{
// What to do
echo __METHOD__.": ".$client."\n";
// return the $this property to make the class properties chainable
return $this;
}
}
$classObj = new ClassName();
$client = "Firefox/Chrome/Safari";
// Call both methods
$classObj->ConfigurePlatform($client)->GetOrdersFromPlatform($client);
//ClassName::ConfigurePlatform: Firefox/Chrome/Safari ClassName::GetOrdersFromPlatform: Firrefox/Chrome/Safari
Привет, Спасибо, что написали это. Я кое-что узнал, но это не то, что я пытался сделать. На самом деле у меня два класса, один из классов создает объект второго класса. Я просто пытался сделать еще один вызов второго класса из другого метода первого класса.
Хорошо, спасибо, не могли бы вы лучше объяснить, что вам нужно?
Удивительно, но то, что он хотел, оказалось намного проще, чем мы ожидали. :)
Если вы планируете использовать один и тот же объект в разных местах класса, вам просто нужно установить его в атрибут того же класса.
class Station
{
public $platform = null;
public function start()
{
$this->platform = new Platform();
$this->platform->ConfigurePlatform('test');
}
public function getOrders()
{
return $this->platform->GetOrdersFromPlatform();
}
}
class Platform
{
private $orders = null;
public function ConfigurePlatform($string)
{
$this->orders = $string;
return $this;
}
public function GetOrdersFromPlatform()
{
return $this->orders;
}
}
$test = new Station();
$test->start();
echo $test->platform->GetOrdersFromPlatform();
//or
echo $test->getOrders();
Это протестированный код: https://3v4l.org/UuTgb
Хорошо, хорошо, но OP сказал based from within the same class.
$ this-> platform-> ConfigurePlatform вызывается тем же классом, я просто привел его в качестве примера, но ладно, давайте исправим.
Попробуйте следующее: $ this -> $ {$ platform} -> GetOrdersFromPlatform ();