动态切换课程结果

时间:2019-06-06 11:56:08

标签: php oop

我正在尝试编写代码,在该代码中可以基于其先前的变量运行一个函数。我不知道如何更好地解释,但可以通过示例来解决。我正在尝试做这样的事情:

<?php
$agric = new Agriculture;
$newplant = $agric-> setClass('plant');
$newanimal = $agric->setClass('animal'); 

$agric->getAll(); // returns null

$newplant->setProperties($plant1_data); //uses plant
$newanimal->setProperties($animal1_data); // uses animal

$newplant->setProperties($plant2_data); //uses plant
$newanimal->setProperties($animal2_data); // uses animal

$newplant->getAll(); // returns all plants array
$newanimal->getAll(); // returns all animals array

$agric->getAll(); // returns both plants array and animals 
?>

因此,以一种形式,新变量将调用setClass以便工作,每次调用它们时,它们都会使用setClass方法来知道应使用哪种类型的参数来运行代码。我知道我可以采取不同的方法,但我似乎喜欢这种方法。任何帮助都可以。预先感谢

2 个答案:

答案 0 :(得分:0)

感谢@everyone ..我终于得到了答案。所以之所以将它给@Dragos,是因为电话工厂似乎是最好的方法。因此,我要做的就是创建两个类。一个是农业,它具有一种使用“ getAll()”来获取所谓属性的方法,另一个是HandleAgric,它也具有“ getAll()”。 HandleAgric有其自己的setClass,该setClass是静态的,每次调用时,它将使用其默认参数实例化一个新的Agriculture。因此,两个类都将使用setClass()和getAll()作为方法。像这样

<?php
class HandleAgric{
    private static $Agriculture;

    public function __construct(){
        self::setClass();
     }

    function __call($method,$args){  
        $self = new self;
        if(method_exists($self::$Agriculture, $method)){
        $call = call_user_func(array($self::$Agriculture, $method));
        return $call;      
    }
    return trigger_error("Error Found!!! Aborting");
    }

    public static function setClass($class=null){
        self::$Agriculture = new Agriculture;
        $call = self::$Agriculture->setClass($class);
        return $call; 
    }
}


    //Example of usage

    $Agric  = new HandleAgric();
    $Plant  = $Agric::setClass("plant");
    $Animal = $Agric::setClass("animal"); 

    $Plant->setProperties($arrayList);   
    $Animal->setProperties($arrayList);

    @ $Plant->getAll() //return plants properties in array;

    @ $Animal->getAll() //return Animal properties in array;

    @ $Agric->getAll() //return Agric (both plant and animal) properties in array;

?>

我相信这会好得多。

答案 1 :(得分:-1)

为使您的示例正常工作,Agricultural的setClass方法必须像工厂一样工作:它基于参数实例化一个类并返回对象。

农业类还必须将所有实例化的对象保留在setClass方法内部的内部数组中,因此,调用getAll方法时,它将遍历每个对象并执行自己的getAll方法。