首页 > 解决方案 > 使用数组作为动态对象实例的查找

问题描述

以下 PHP 用于 JavaScript 文件进行的 AJAX 调用。

首先,基础类 -

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';
    }
}

现在,由两个单独的 JS 文件共享并调用方法的 PHP -

// $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 脚本只询问名称和边,从不询问半径。同样,circle 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

解决方案


只需为方法不存在的情况添加一个魔术方法。

也将其添加到三角形

<?php

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

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

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

此处有关重载的 PHP 文档


推荐阅读