Следующий PHP используется для вызовов AJAX, выполняемых файлами JavaScript.

Во-первых, базовые классы -

class Triangle
{
    public function GetName()
    {
        return 'name is triangle';
    }

    public function GetSides()
    {
        return 'number of sides is three';
    }
}

class Circle
{
    public function GetName()
    {
        return 'name is circle';
    }

    public function GetRadius()
    {
        return 'radius is nonsense';
    }
}

Теперь PHP, который используется двумя отдельными файлами JS и вызывает методы -

// $caller = 'triangle';
// $action = 'name';
// $action = 'sides';

$caller = 'circle';
// $action = 'name';
$action = 'radius';

$objects = [
    'triangle'  => new Triangle(),
    'circle'    => new Circle()
];

$object = $objects[$caller];

if ($action == 'name'):
    $data = $object->GetName();
elseif ($action == 'sides'):
    $data = $object->GetSides();
elseif ($action == 'radius'):
    $data = $object->GetRadius();
endif;

echo $data;

Как это в настоящее время настроено (для включенных строк выше) это повторяется: radius is nonsense. JS-скрипт треугольника всегда запрашивает только имя и стороны, а не радиус. Точно так же JS-скрипт окружности всегда запрашивает только имя и радиус, а не стороны. Итак, это работает. Однако я пытаюсь использовать массив в качестве поиска для замены блока кода IF следующим образом:

$array = [
    'name' => $object->GetName(),
    'sides' => $object->GetSides(),
    'radius' => $object->GetRadius()
];

$data = $array[$action];

echo $data;

Но это приводит к Fatal error: Call to undefined method Circle::GetSides(). Можно ли это исправить, и если да, то как?

php
1
knot22 24 Окт 2018 в 03:25

2 ответа

Лучший ответ

Просто добавьте волшебный метод для случая отсутствия метода.

Также добавьте это в треугольник

<?php

class Circle
{
    public  function __call($name, $arguments)
    {
        return '';
    }

    public function GetName()
    {
        return 'name is circle';
    }

    public function GetRadius()
    {
        return 'radius is nonsense';
    }
}

Документы PHP по перегрузке здесь

0
YouriKoeman 24 Окт 2018 в 00:44

Альтернативный подход, который, кажется, работает, использует method_exists () в поисковом массиве, например:

$array = [
    'name' => method_exists($object, 'GetName') ? $object->GetName() : '',
    'sides' => method_exists($object, 'GetSides') ? $object->GetSides() : '',
    'radius' => method_exists($object, 'GetRadius') ? $object->GetRadius() : ''
];
0
knot22 25 Окт 2018 в 00:34
52959502