我有一个像这样的PHP函数:
function count_nutrient_value($input){
// some difficult operations here
return $output; // this is a string
}
我正在使用这个(例子):
$print .= 'This nutrient is giving you '.count_nutrient_value(40).' percent.';
现在的问题是,从函数中,我需要返回另一个值 - 数字是上升还是下降的信息。所以我改变了功能:
function count_nutrient_value_new($input){
// some difficult operations here
return array($output,$status); // this is an array, obviously
}
但现在我不能轻易使用这个功能,因为我不能再这样做了:
$print .= 'This nutrient is giving you '.count_nutrient_value_new(40).' percent.';
但相反,我需要将它扩展到更多行,如下所示:
$return = count_nutrient_value_new(40);
$print .= 'This nutrient is giving you '.$return[0].' percent.';
这种情况有解决方案吗?这将是:
A)不从函数返回数组(但以其他方式解决问题)
B)返回一个数组,找到一种在代码中使用该函数的更简单方法
C)其他?
答案 0 :(得分:4)
您为每个目的制作两个功能,并从另一个中调用一个。
function count_nutrient_value_string( $input ){
$array = count_nutrient_value_array( $input );
return $array[ 0 ];
}
function count_nutrient_value_array( $input ){
// some difficult operations here
return array( $output, $status );
}
$print .= 'This nutrient is giving you '.count_nutrient_value_string(40).' percent.';
(函数名称应优于_string
和_array
,具体取决于他们实际执行的操作。)
答案 1 :(得分:2)
我会避免更改函数的签名,因为它可能会破坏某些代码。相反,我宁愿添加并调用一个新函数。
无论如何,如果我必须按照你在这里描述的方式更改函数,我会使用utilisty类而不是数组。
类似的东西:
class nutrientResults {
public $status = SOME_DEFAULT_VALUE;
public $count = 0;
public function __construct($count, $st = SOME_DEFAULT_VALUE) {
$this->count = $count;
$this->status = $st;
}
public function __toString() {
return (string) $this->count;
}
}
然后:
function count_nutrient_value($input){
// some difficult operations here
return new nutrientResults($count, $status);
}
$print .= 'This nutrient is giving you '.count_nutrient_value(40).' percent.';
// as usual..., so backwards compatibility maintained
答案 2 :(得分:0)
您可以使用输出参数。
function count_nutrient_value($input, &$out1, &$out2){
// some difficult operations here
$out1 = $output[0];
$out2 = $output[1];
return $output[0]; // return the same
}
$print .= 'This nutrient is giving you '.count_nutrient_value(40, $o1, $o2).' percent.';
// Do other things with $o1 and $o2.
在php 5中,您还可以使用可选参数:
function count_nutrient_value($input, &$out1 = '', &$out2 = ''){
// some difficult operations here
$out1 = $output[0];
$out2 = $output[1];
return $output[0]; // return the same
}
// Call without out parameters
$print .= 'This nutrient is giving you '.count_nutrient_value(40).' percent.';
答案 3 :(得分:0)
将该函数转换为一个小类,$output
和$ status作为属性:
class count_nutrient_value() {
public $output;
public $status;
function __construct($input) {
// Do complicate stuff here
$this->output = $output_result;
$this->status = $status_result;
}
}
然后你可以做
$nutrient = new count_nutrient_value($input);
$print .= 'This nutrient is giving you '.$nutrient->output.' percent.';
答案 4 :(得分:0)
分割数据源和一些存取器/变换器中的功能可能是正确的选择
如果您正在使用数据源返回的数组/对象的全部(或大部分)信息,那么最好还是存储/更改一次,而不是每次调用访问器函数时重新创建。
现在,作为您现在所拥有的内容的简单替代,请查看 v printf函数系列。他们不使用省略号(printf($format, ...)
,例如printf('%d %s %d', 1,'a', 3)
),而是使用一组参数:vprintf('%d %s %d', array(1,'a', 3))
,可以很容易地从另一个函数传递或传递给另一个函数。
<?php
function count_nutrient_value($input) {
return array($input*0.1, ' approved');
}
$result = vsprintf('This%2$s nutrient is giving you %1$d percent.', count_nutrient_value(40));
echo $result;
答案 5 :(得分:-2)
您可以使用示例代码返回数组值:
function count_nutrient_value_new($input){
// some difficult operations here
return array('output' => $output, 'status' => $status); // this is an array, obviously
}
然后得到的值是:
$print .= 'This nutrient is giving you '.$return["output"].' percent.';