Как вызвать функцию на основе переменной из объекта в том же классе?

Я знаю, как вызвать функцию на основе такой переменной:

$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 ();

Inazo 23.08.2018 14:18

Спасибо, но такая же ошибка.

user2924019 23.08.2018 14:19

Почему вы используете $this? Разве это не должно быть просто $platform->GetOrdersFromPlatform();?

simon 23.08.2018 14:20

какая у вас версия php?

Erisan Olasheni 23.08.2018 14:20

И если вы хотите создать экземпляр класса, то это должно быть: $platform=, а не $this->$platform.

Erisan Olasheni 23.08.2018 14:22

@simon Пропустил это исключено, когда я это делаю, я получаю Fatal error: Call to a member function GetOrdersFromPlatform() on a non-object

user2924019 23.08.2018 14:24

@ErisanOlasheni Вот что я делаю. 5.3.1

user2924019 23.08.2018 14:25

Вы должны использовать фабрику шаблонов проектирования phptherightway.com/pages/Design-Patterns.html

Fky 23.08.2018 14:26

Я понял, что делаю неправильно. Я понятия не имею, почему я пытаюсь установить имя объекта как переменное. Просто сделать $this->platform = new $platform_name(); подойдет для моих нужд. Просто я не буду знать названия каждой платформы, так как они будут закодированы другими позже.

user2924019 23.08.2018 14:27

Я неправильно понял вопрос, думаю, теперь понял. Вы хотите, чтобы объектная платформа, которая использовалась где-то еще, по-прежнему использовалась в том же объекте, не так ли?

Rafael 23.08.2018 14:42

Да это оно. Я все еще учусь, поэтому немного борюсь с терминологией.

user2924019 23.08.2018 14:43

Не волнуйтесь, бывает. Если вы знаете, что собираетесь использовать экземпляр другого объекта для нескольких операций, вам обязательно следует подумать о добавлении его в атрибут исходного класса ... таким образом, вы можете продолжать выполнять операции с ним, не теряя ссылку. Это очень стандартная практика в ООП.

Rafael 23.08.2018 14:52
Стоит ли изучать 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 и хотите разрабатывать...
2
12
56
2

Ответы 2

Ваш вопрос не ясен, но я думаю, что вам нужно объединение методов, это можно сделать, вернув свойство класса $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

Привет, Спасибо, что написали это. Я кое-что узнал, но это не то, что я пытался сделать. На самом деле у меня два класса, один из классов создает объект второго класса. Я просто пытался сделать еще один вызов второго класса из другого метода первого класса.

user2924019 23.08.2018 14:46

Хорошо, спасибо, не могли бы вы лучше объяснить, что вам нужно?

Erisan Olasheni 23.08.2018 14:48

Удивительно, но то, что он хотел, оказалось намного проще, чем мы ожидали. :)

Rafael 23.08.2018 14:57

Если вы планируете использовать один и тот же объект в разных местах класса, вам просто нужно установить его в атрибут того же класса.

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.

Erisan Olasheni 23.08.2018 15:24

$ this-> platform-> ConfigurePlatform вызывается тем же классом, я просто привел его в качестве примера, но ладно, давайте исправим.

Rafael 23.08.2018 15:25

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