我在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>
答案 0 :(得分:2)
所以这是我能看到的问题:
$calculate = new Calculate($u_age, $u_name, $u_hours);
displayCalculation()
。这可能是围绕上面构造函数问题的混淆。displayCalculation()
方法调用未定义的$calc
。它应该是$this->calculateHours()
我认为您对如何实例化和运行此代码感到有点困惑。以下是我的建议:
添加一个构造函数方法,该方法将设置变量(稍后添加验证):
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,你将从构造函数参数中设置它们。