该方法不在PHP中以OOP显示结果

时间:2015-10-22 22:21:30

标签: php oop

我在php中练习oop。我非常新的oop在PHP中。即时尝试使用以下代码,但它无法正常工作。问题是displayCalculation方法不打印变量的值。但是calculateHours方法正在工作并显示输出,我测试了它。我做错了什么。请根据以下语法给出答案,我知道我可以通过许多其他方式执行此操作,但我想知道这个方面有什么问题。谢谢你的时间。

<?php

class Calculate {
    public $name;
    public $age;
    public $night_hours;

    public function calculateHours($u_age, $u_name, $u_hours) {
        $this->age = $u_age;
        $this->name = $u_name;
        $this->night_hours = $u_hours;
        $calc = ($this->age * $this->night_hours) / 24;
        return $calc;
    }
    public function displayCalculation() {
        $this->calculateHours($this->age, $this->name, $this->night_hours);
        echo "Mr." . $this->name . " you have wasted " . $calc . " years of your life sleepin..";
    }
}

?>
<html>
<head>
    <title>OOP Form</title>
    <style>
    body{background-color:black;color:white;}
    </style>
</head>
<body>
    <center>Calculate Slept Years</center>
    <form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>" name="form1">
        Enter Name:<br>
        <input type="text" name="u_name" placeholder="Enter Name"><br>
        Age:<br>
        <input type="text" name="u_age" placeholder="Enter Age"><br>
        Night Sleep Hours:<br>
        <input type="text" name="u_hours" placeholder="Enter Hours you Sleep at night"><br>
        <br>
        <input type="submit" name="btn" value="Calculate">
    </form>
    <?php
    if (isset($_POST["btn"])) {
        $u_age = $_POST["u_age"];
        $u_name = $_POST["u_name"];
        $u_hours = $_POST["u_hours"];

        $calculate = new Calculate($u_age, $u_name, $u_hours);
        $calculate->displayCalculation();
        echo $calculate->calculateHours($u_age, $u_name, $u_hours);
    }
    ?>
    </body>
</html>

1 个答案:

答案 0 :(得分:2)

所以这是我能看到的问题:

  1. 你调用构造函数方法,但没有一个(没有问题,只是毫无意义) - $calculate = new Calculate($u_age, $u_name, $u_hours);
  2. 在计算之前,请致电displayCalculation()。这可能是围绕上面构造函数问题的混淆。
  3. 您的displayCalculation()方法调用未定义的$calc。它应该是$this->calculateHours()
  4. 的返回值

    我认为您对如何实例化和运行此代码感到有点困惑。以下是我的建议:

    添加一个构造函数方法,该方法将设置变量(稍后添加验证):

    class Calculate {
        ...
        public function __construct($u_age, $u_name, $u_hours) {
            $this->age = $u_age;
            $this->name = $u_name;
            $this->night_hours = $u_hours;
        }
    }
    

    现在,实例化Calculate并传入变量:

    $calculate = new Calculate($u_age, $u_name, $u_hours);
    

    最后,从HTML中调用displayCalculation()方法。将实际计算调用等保留给Calculate类来处理自己:

    $calculate->displayCalculation();
    

    您需要调整displayCalculation()方法以使用calculateHours()方法的返回值。在这个特定示例中,OOP的概念是构造函数在实例化Calculate类时设置变量,因此您不需要在类中传递变量。相反,只需通过$this->age等从任何方法访问它们:

    protected function calculateHours() {
        $calc = ($this->age * $this->night_hours) / 24;
        return $calc;
    }
    

    请注意,我已经使该方法受到保护而不是公共,这意味着您无法从类外部(即从HTML)调用它。您应该只想调用displayCalculation()方法,因此只有那个(和构造函数)才会公开。

    当然,您实际上可能在这里不同意我并说“如果我想在没有格式化的情况下访问计算数据怎么办?” - 在这种情况下,确保 - 再次公开。

    所以你的课程最终会像这样:

    class Calculate {
        protected $name;
        protected $age;
        protected $night_hours;
    
        public function __construct($u_age, $u_name, $u_hours) {
            $this->age = $u_age;
            $this->name = $u_name;
            $this->night_hours = $u_hours;
        }
    
        protected function calculateHours() {
            $calc = ($this->age * $this->night_hours) / 24;
            return $calc;
        }
    
        public function displayCalculation() {
            $calc = $this->calculateHours();
            echo "Mr." . $this->name . " you have wasted " . $calc . " years of your life sleepin..";
        }
    }
    

    你的HTML:

    if (isset($_POST["btn"])) {
        $u_age = $_POST["u_age"];
        $u_name = $_POST["u_name"];
        $u_hours = $_POST["u_hours"];
    
        $calculate = new Calculate($u_age, $u_name, $u_hours);
        $calculate->displayCalculation();
    }
    

    编辑:只是注意到您的类属性也是公开的 - 这意味着您实际上可以从类外部(即HTML)中设置它们。我真的不喜欢这种方法,所以在上面的例子中我改为将它们改为protected,你将从构造函数参数中设置它们。