【问题标题】:Why does my class only return the first value?为什么我的类只返回第一个值?
【发布时间】:2012-04-26 17:22:13
【问题描述】:

即使我将返回更改为回显,这个类也会给我一个空白输出,我不确定问题是什么,但我显然不那么精通处理类和对象。

我确定我只是错误地处理了变量/数组,但我看不到在哪里,也许这些变量不应该在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

【问题讨论】:

  • 这似乎没有什么不同。
  • @mgraph:没关系...

标签: php class function


【解决方案1】:

您到处都缺少对象自引用:$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.");
    }
}

应该可以的。

【讨论】:

  • 嗯,这似乎修复了部分问题,但现在它只打印 FIRSTNAME 而不是所有信息。
  • 如果您更新代码,您是否也可以更新您拥有的示例?
  • 感谢您的编辑帮助了很多。实际上最后一个问题@Malovich,我如何让脚本循环遍历返回的值?在echo $p1->create_people($p1); ?
  • 将收集到的值作为数组返回,并将其分配给变量。 foreach 数组并在执行过程中回显它们。
  • function echo_arguments{foreach(echo $this->create_people($this) as $values){echo $values;}} $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"; $p1->echo_arguments($p1); 只是为我提供了 create_people 的错误处理程序死亡事件,“必须输入除中间名之外的所有值。”
【解决方案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. 函数到此结束,其他一切都没有执行。

一个函数只能有一个返回值。如果您需要返回不止一件事物的信息,则需要将其作为数组或对象返回,以便将其全部包含在一个元素中。

目前我不太确定你想通过你的课程完成什么,所以很遗憾我无法帮助你完成你需要做的事情。

编辑:在这种情况下你不需要返回任何东西。您的类已经使类中的所有函数都可以访问这些变量。使用“new”创建对象的一个​​实例,即创建“a 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();

显然这没有实际用途,但希望能说明它是如何工作的。如您所见,根本不需要变量传递。

【讨论】:

  • 我希望返回我在函数中输入的所有值,因为这些信息将被传递给类中的其他函数。我只是为了调试目的而尝试回应它。
  • 那么我的返回循环是否会正确地将每个值返回给我的其他函数,如果不是,我应该如何更新它呢?
  • 如果您想让它返回您输入的所有数据,有两种方法。您可以返回所有数据的 array,然后返回 var_dump() 它而不是 echo。或者您可以返回一个包含所有数据的 string。对于前者,您将删除 foreach 并执行 return $temp_arr;。对于后者,将生成的字符串放在循环中,例如 $result_line .= $values; /*...*/ return $result_line;
【解决方案3】:

在第 14 行:

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

应该是:

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

同样的第 16 行:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多