foreach在课堂方法内不起作用



我倾向于php5类,实例我是新手。但是我试图在Class Methods内使用foreach循环来获取该人的性别,但它仅适合第一人称,但不适合第二人称第3人,依此类推。

这是我的代码:

class Person{
    // atteributes or property of class
    var $first_name;
    var $last_name;
    var $legs = 2;
    var $hand = 2;
    var $gender;
    function say_hello(){
        echo "Hello inside the class from " . get_class($this) . "<br />";
    }
    // full name function
    function full_name(){
        echo $this->first_name ." ". $this->last_name;
    }
    // Gender
    function gender(){
        $names = array("Hamza","Ali","Ibrar","Muqeet","Hassan","Umer","Shaveer");
        foreach($names as $name){
            if($this->first_name == $name){
                echo $this->gender = "Male";
                break;
            }else{
                echo $this->gender = "Female";
                break;
            }
        }
    }
}
$person = new Person();
$person->first_name = "Hamza";
$person->last_name = "Nisar";
$person->full_name();
echo "<br />";
$person->gender();
echo "<br />";
/*---------------------*/
$person2 = new Person();
$person2->first_name = "Ibrar";
$person2->last_name = "Ahmed";
$person2->full_name();
echo "<br />";
$person2->gender();
echo "<br />";

这是结果:

Hamza Nisar
Male
Ibrar Ahmed
Female

它也必须显示第二人称的男性

使用foreach循环并检查每种可能性似乎是一种实现这一目标的奇怪方法。我建议用IN_ARRAY函数替换foreach函数,当在语句中使用时,该功能允许您使用较少的代码进行相同的操作。

示例:

<?php 
class Person{
    // atteributes or property of class
    var $first_name;
    var $last_name;
    var $legs = 2;
    var $hand = 2;
    var $gender;
    function say_hello(){
        echo "Hello inside the class from " . get_class($this) . "<br />";
    }
    // full name function
    function full_name(){
        echo $this->first_name ." ". $this->last_name;
    }
    // Gender
    function gender(){
        $names = array("Hamza","Ali","Ibrar","Muqeet","Hassan","Umer","Shaveer");
        if(in_array($this->first_name, $names)){
            echo $this->gender = "Male";
        }
        else {
            echo $this->gender = "Female";
        }
    }
}
$person = new Person();
$person->first_name = "Hamza";
$person->last_name = "Nisar";
$person->full_name();
echo "<br />";
$person->gender();
echo "<br />";
/*---------------------*/
$person2 = new Person();
$person2->first_name = "Ibrar";
$person2->last_name = "Ahmed";
$person2->full_name();
echo "<br />";
$person2->gender();
echo "<br />";
?>

这些答案都不告诉您为什么您的代码不起作用。让我们按照first_name =" ibrar"的逻辑来遵循foreach的逻辑:

$names = array("Hamza","Ali","Ibrar","Muqeet","Hassan","Umer","Shaveer");
foreach($names as $name){
    if($this->first_name == $name){
        echo $this->gender = "Male";
        break;
    }else{
        echo $this->gender = "Female";
        break;
    }
}

loop1:if语句是错误的,为" ibrar"!==" hamza"。因此,使用了其他印刷女性并断裂的否则。

其他答案是很好的修复。但是,假设您仍然想使用 foreach 循环。您可以做这样的事情:

$this->gender = 'Female';
$names = array("Hamza","Ali","Ibrar","Muqeet","Hassan","Umer","Shaveer");
foreach($names as $name){
    if ($this->first_name === $name) {
        $this-gender = 'Male';
        break;
    }
}
echo $this->gender;
<?php
class Person{
    // atteributes or property of class
    var $first_name;
    var $last_name;
    var $legs = 2;
    var $hand = 2;
    var $gender;
    function say_hello(){
        echo "Hello inside the class from " . get_class($this) . "<br />";
    }
    // full name function
    function full_name(){
        echo $this->first_name ." ". $this->last_name;
    }
    // Gender
    function gender($newname){
        $names = array("Hamza","Ali","Ibrar","Muqeet","Hassan","Umer","Shaveer");
        if(in_array($this->first_name, $names)){
            echo $this->gender = "Male";            
        }else{
            echo $this->gender = "Female";          
        }
    }
}
$person = new Person();
$person->first_name = "Hamza";
$person->last_name = "Nisar";
$person->full_name();
echo "<br />";
$person->gender($person->first_name);
echo "<br />";
/*---------------------*/
$person2 = new Person();
$person2->first_name = "Ibrar";
$person2->last_name = "Ahmed";
$person2->full_name();
echo "<br />";
$person2->gender($person2->first_name);
echo "<br />";
?>

您需要关心的东西是 break 关键字。如果您想获得预期的结果,则需要跟踪代码的流程。这是根据您的代码所说的:

我将从您做错的代码部分开始:

对于$person对象, $person->gender()将像这样执行:

迭代1:

foreach($names as $name)结果$name = "Hamza"

$this->first_name"Hamza",是 == $name

如果这里的条件为真,则打印"男性"。

break;突破foreach循环。

没有其他迭代。

输出为:

Male

对于$person2对象, $person2->gender()将这样执行:

迭代1:

foreach($names as $name)结果$name = "Hamza"

$this->first_name"Ibrar",是!= $name

如果这里的条件不正确,即是错误的,则打印"女性"。

break;突破了foreach循环。

没有其他迭代。

输出为:

Female

您的代码不说您想要什么。

它说:

如果Array的第一项具有我们想要的名称,请打印"男性",否则打印"女性"。我们已经完成并仅在检查阵列中的第一项后才突破foreach循环。我们不需要检查同一数组中的其他项目。

,这将是结果:

对于Person类的每个对象,您创建的没有$first_name属性值作为"Hamza""Female"将从呼叫到成员函数gender()

解决方案是编写代码:

如果条件为false,则不应脱离循环,因为必须使用$names数组中的每个项目检查$this->first_name。如果$names阵列中的所有项目返回false,则$gender属性值是"女性"。

解决方案代码:其他答案已经提到。

没有foreach requred更改yor性别函数如下,并在函数调用之前编写回声。

function gender(){
    $names = array("Hamza","Ali","Ibrar","Muqeet","Hassan","Umer","Shaveer");
    if(in_array($this->first_name,$names)){
        return $this->gender = "Male";
    }else{
        return $this->gender = "Female";
    }
}

最新更新