为什么我的班级只返回第一个值?

时间:2012-04-26 17:22:13

标签: php class function

这个类给了我一个空白的输出,即使我改变回到echo,我不知道问题是什么,但我显然不是那么精通处理类和对象。

我确定我只是错误地处理变量/数组,但我看不到哪里,也许不应该在Class下声明变量,因为只有当一个人是产生的?我应该在函数中声明变量,还是不要声明它们,因为它们应该由$args处理?

更新了问题:如何让它返回每个参数而不仅仅是FIRSTNAME?

PHP:

class people_handler
{
    public $firstname;
    public $middlename;
    public $lastname;
    public $city;
    public $province_state;
    /* zip+4 is default for postcode (postal code) */
    public $postcode;
    public $country;

    function create_people($args)
    {
        $fullname=array($this->firstname,$this->middlename,$this->lastname);
        $normname=array($this->firstname,$this->lastname);
        $fulladdress=array($this->city,$this->province_state,$this->postcode,$this->country);
        if(!$args->middlename&&$args->firstname && $args->lastname && $args->city && $args->province_state && $args->postcode && $args->country)
        {
            $temp_arr=array($normname,$fulladdress);
            foreach($temp_arr as $value)
            {
                foreach($value as $values)
                {
                    return $values;
                }
            }
        }
        else if($args->firstname && $args->middlename && $args->lastname && $args->city && $args->province_state && $args->postcode && $args->country)
        {
            $temp_arr=array($fullname,$fulladdress);
            foreach($temp_arr as $value)
            {
                foreach($value as $values)
                {
                    return $values;
                }
            }
        }
        else
        {
            die ("Must enter all values excluding middlename.");
        }
    }
}

$p1=new people_handler;
$p1->firstname="John";
$p1->middlename="Jonah";
$p1->lastname="Jameson";
$p1->city="Lansing";
$p1->province_state="Michigan";
$p1->postcode="48876-4444";
$p1->country="USA";


echo $p1->create_people($p1);

返回:

John

3 个答案:

答案 0 :(得分:3)

你错过了对象自引用:$this遍布整个地方。

无论何时从类中引用方法或属性,都需要将$ this作为正在执行该过程的Object的当前实例化。所以,例如......

$fullname=array($firstname,$middlename,$lastname);  

变为

 $fullname=array($this->firstname,$this->middlename,$this->lastname);  

哪个应该有效,因为您已经将值分配给这些属性。

编辑:进一步查看代码,不断通过循环返回值将不会管理对浏览器的回显。你可以echo $value而不是返回它,或者从值构建一个数组并返回它并让脚本处理数组以回显给浏览器。

编辑第二个:要获得所有值,您需要在构建它们时收集它们。另一种选择是将它们作为方法的一部分简单地输出到浏览器。这两个选项都有效,但将它们收集到一个数组中会使它更具可移植性,但也需要维护更多的代码。同样,您不需要将对象传递给自身以使该方法起作用。

echo $p1->create_people($p1);

应该......

$p1->create_people();

create_people你会......

function create_people()
{
    $fullname=array($this->firstname,$this->middlename,$this->lastname);
    $normname=array($this->firstname,$this->lastname);
    $fulladdress=array($this->city, $this->province_state, $this->postcode, $this->country);
    if($args->firstname && $args->lastname && $args->city && $args->province_state && $args->postcode && $args->country)
    { //Don't bother including middlename if it doesn't matter if it is filled or not...
        $temp_arr = array($normname, $fulladdress);
        foreach($temp_arr as $value)
        {
            foreach($value as $values)
            {
                echo $values;
            }
        }
    } else {
        die ("Must enter all values excluding middlename.");
    }
}

这应该有效。

答案 1 :(得分:2)

除了自引用问题(顺便说一句$args也不需要,因为这应该是自引用),你的循环结构是错误的。

$temp_arr=array($normname,$fulladdress);
foreach($temp_arr as $value)
{
   foreach($value as $values)
   {
       return $values;
   }
}

这将:

  1. 循环访问temp_arr,将$ normname作为第一个值
  2. 将$ normname视为数组并循环遍历
  3. 返回它在$ normname
  4. 中找到的第一个值
  5. 结束了这个功能,其他一切都没有被执行。
  6. 一个函数只能有一个返回值。如果您需要返回多个信息,则需要将其作为数组或对象返回,以便将它们全部包含在一个元素中。

    目前我不太确定你在课堂上想要完成什么,所以不幸的是我无法帮助你做你需要做的事。

    编辑:在这种情况下你不需要返回任何东西。您的类使这些变量可以被类中的所有函数访问。使用“new”,您可以创建对象的实例,即创建“people_handler”。这个people_handler有关于它的属性,你公之于众,所以它们可以在课外设置(在一个更大的项目中可能不是一个好主意,但对此似乎很好)。作为类的一部分(即在其中)的所有函数都可以使用自引用$this来访问这些属性当前对于某些people_handler的值:class TestClass { public fullname; //a random "property" function echoFullname() { echo $this->fullname; //whatever fullname is at the moment for the TestClass object we are using } } $a = new TestClass(); //Create a TestClass object $a->fullname = "Alex"; //make its name "Alex" $b = new TestClass(); //Create another TestClass object $b->fullname = "Carl"; //but let's name him Carl $a->echoFullname(); //And now output the names $b->echoFullname();

    {{1}}

    显然这没有实际用途,但希望说明它是如何工作的。正如你所看到的,变量传递根本不是必需的。

答案 2 :(得分:1)

第14行:

    $fullname=array($firstname,$middlename,$lastname);

可能应该是:

    $fullname=array($this->firstname,$this->middlename,$this->lastname);

同一行16:

    $fulladdress=array($city,$province_state,$postcode,$country);