从类函数多次返回

时间:2013-08-08 12:44:02

标签: php oop

我正在学习php OOP。在编写类时,我遇到了一个逻辑问题,即函数没有返回多个值,我只是将默认值作为输出。 当我在函数 setproperty()中传递两个变量并回调 getproperty()时,它只返回作者的名字。这是代码:

class library{
    public $BookName="PHP OOP Programming";
    public $author="Faisal";

    public function setproperty($a_name,$b_name){
        $this->author=$a_name;
        //$this->BookName=$b_name;
    }

    public function getproperty(){
        return $this->author."<br />";
        //return $this->BookName."<br />";
    }
}
$obj=new library;
//var_dump($obj);

echo $obj->getproperty();
$obj->setproperty("naseer","SQL");
echo $obj->getproperty();

我得到了输出:

Faisal
naseer

虽然我想要的输出是作者的名字和书籍,很像:

Faisal
PHP OOP Programming

naseer
SQL

3 个答案:

答案 0 :(得分:4)

您无法在函数中多次返回。

如果您需要返回多个值,可以执行以下操作:

return array('author'=>$this->author, 'bookName'=>$this->bookName);

并像这样使用它:

$res = $obj->getproperty();
echo "Author is ".$res['author'];
echo "Book is ".$res['bookName'];

您可能希望根据方法的用途/使用方式进行更改。

答案 1 :(得分:1)

return语句是任何函数的结束。这就是为什么当一个函数完成它需要做的任何事情时,“已经返回”的功能。这不是OO独有的,而是所有编程语言中的函数 你想要做的是:

return $this->author.'<br/>'.$this->bookName.'<br/>';

在这里,我将所有值连接成一个字符串常量,然后返回。这样,我有一个返回值,以及一个带有所需输出的return语句 就像我说的,即使是非方法(常规函数)也不能返回超过1的值 - 它们也不能返回 less 而不是1值:

function aFunction()
{
    echo '123';
}

虽然缺少显式返回:

$foo = 'not null';
$foo = aFunction();
var_dump($foo);//null!

该函数显然返回null,就像在C中一样,一个不需要返回任何值的函数,返回void,或者JavaScript函数返回undefined。这同样适用于方法:它们返回null,隐式或单个显式返回值 您也可以编写这样的代码:

function sillyFunction($someArgument = 1)
{
    return true;
    if ($someArgument < 0)
    {
        return false;
    }
    if ($someArgument === 0)
    {
        return null;
    }
    return $someArgument%2;
}

此函数以return true;语句开头。永远不会到达任何后面的代码,因此永远不会执行,因为此函数必须某些内容返回给调用者,然后调用者再次接管。你不能回到这个功能并继续你在那里做的事情。功能是一次性的。

变通方法:值得庆幸的是,对象和数组被视为单个值,因此它们可以从函数返回,并且可以包含多个值。所以这是以某种方式获得函数返回多个值的最常见方式。唯一的小缺点是,一旦函数返回,您只有一个访问点用于所有这些值:您为其指定返回值的变量:

function foo()
{
    return array('foo' => range(1,100), 'bar' => range('A','Z'));
}
$foo = foo();
echo $foo['foo'][1], ' => ', $foo['bar'][1];//echoes 2 => B

在一些非常罕见的案例中(过去10年,我需要这5次)你可以使用引用排序几个值:< / p>

function changeArrayAndReturn(array &$arrayRef)
{
    array_push($arrayRef, 'I was added in the function');//alters array
    return count($arrayRef);//AND returns int
}
$foo = array();
echo changeArrayAndReturn($foo);//echoes 1
$foo[] = 'I was added outside of the function';
echo changeArrayAndReturn($foo);//echoes 3
var_dump($foo);
//array(I was added in the function, I was added outside of the function, I was added in the function)

但这很危险且很难维护,所以要远离,除非你真的不能以任何其他方式做到

答案 2 :(得分:0)

函数遇到第一个return时会停止。所以它永远不会到达你注释掉的那一行(即使它不是评论)。

public function getproperty()
{
  return $this->author."<br />".$this->BookName."<br />";
}

这样您可以使用单个return显示这两个值。如果您愿意,也可以返回一个数组。