在PHP中,假设你有这样的代码:
$infrastructure = mt_rand(0,100);
if ($infrastructure < $min_infrastructure) $infrastructure = $min_infrastructure;
//do some other stuff with $infrastructure
$country->set_infrastructure($infrastructure);
$education = mt_rand(0,100);
if ($education < $min_education) $education = $min_education;
//do some other stuff with $education
$country->set_education($education);
$healthcare = mt_rand(0,100);
if ($healthcare < $min_healthcare) $healthcare = $min_healthcare;
//do some other stuff with $healthcare
$country->set_healthcare($healthcare);
是否有某种方法可以将这些类似的指令集合组合成一个可以调用的函数:
change_stats("infrastructure");
change_stats("education");
change_stats("healthcare");
基本上,可以在其他变量名和函数名中使用PHP中的变量吗?
提前致谢。
答案 0 :(得分:3)
您可以使用PHP调用"variable variables"来执行此操作。我希望你的例子是人为的,因为它看起来有点奇怪,但假设变量和对象是全局的,你可以像这样编写name_pet()函数:
function name_pet($type, $name)
{
$class='the_'.$type;
$var=$type.'_name';
$GLOBALS[$class]->setName($name);
$GLOBALS[$var]=$name;
}
编辑:此答案涉及问题的早期版本。
答案 1 :(得分:0)
我不确定该功能,但你可以使用__set
做类似的事情$data;
function __set($key, $val) {
$this->data["$key"] = $val;
}
是的,你可以动态使用变量
$foo = "bar";
$dynamic = "foo";
echo $$dynamic; //would output bar
echo $dynamic; //would output foo
答案 2 :(得分:0)
答案 3 :(得分:0)
回答你的问题:是的,你可以使用$ {$ varname}语法将变量用作变量名。
但是,对于您在此处尝试执行的操作,这似乎不是一个正确的解决方案,因为设置$ _ _ $ petname}变量需要它们在name_pet函数的范围内。
你能详细说明一下你想做什么吗?
一些建议:让宠物类(或猫,狗和鱼的任何东西)返回正在设置的名称,这样你就可以做$ fish_name = $ the_fish-&gt; setName(“Goldie”) ;
甚至更好,根本不使用$ fish_name,因为该信息现在存储在对象中......你可以简单地调用$ the_fish-&gt; getName();你在哪里使用$ the_fish。
希望这有帮助吗?
答案 4 :(得分:0)
这是一个有趣的问题,因为这是一种常见的模式,在重构时要特别注意。
以纯粹的功能方式,你可以使用这样的代码:
function rand_or_min( $value, $key, $country ) {
$rand = mt_rand(0,100);
if ($rand < $value ) { $rand = $value; }
// do something
call_user_func( array( $country, 'set_' . $value ), array( $rand ) );
}
$arr = array('infrastructure' => 5,'education' => 3,'healthcare' => 80);
array_walk( $arr, 'rand_or_min', $country );
虽然上述方法效果很好,但我强烈建议您使用更面向对象的路径。每当你看到如上所述的模式时,你应该考虑类和子类。为什么?因为存在重复的行为和类似的状态(变量)。
以更多的OOP方式,可以这样实现:
class SomeBasicBehavior {
function __construct( $min = 0 ) {
$rand = mt_rand(0,100);
if( $rand < $min ) { $rand = $min };
return $rand;
}
}
class Infrastructure extends SomeBasicBehavior {
}
class Education extends SomeBasicBehavior {
}
class Healthcare extends SomeBasicBehavior {
}
$country->set_infrastructure( new Infrastructure() );
$country->set_education( new Education() };
$country->set_healthcare( new Healthcare() };
它不仅更具可读性,而且更具可扩展性和可测试性。您可以轻松地将“执行某些操作”实现为每个类中的成员函数,并且可以根据需要(使用SomeBasicBehavior类)或根据需要进行封装来共享它们的行为。