背景
如标题中标题所述,我是第二年的IT学生,我们刚开始使用PHP编程模块。
过去我曾经和PHP合作过很多次。我熟悉使用函数等的基础知识,但习惯OOP对我来说是一个全新的球类游戏。
我真的很难将OOP的基础知识降下来,我的意思是我理解了我的理解...... 我只需要那个灯泡继续这就是我的意思希望有人可以帮助我。
我的代码
我有点惭愧发布我提出的代码到下面的问题,我做了很多调整,并在我的规定的书中多次阅读OOP页面,但我不断收到错误,所以我想我别无选择。
class Movie{
public $title;
public $director;
public $cost;
public $actor;
function __construct($title, $director, $cost){
$title = $this->title;
$director = $this->director;
$cost = $this->cost;
}
function getTitle(){
return $this->title;
}
function setTitle($newTitle){
$this->title=$newTitle;
}
function setDirector($newDirector){
$this->director=$newDirector;
}
function getDirector(){
return $this->director;
}
function setCost($newCost){
$this->cost=$newCost;
}
function getCost(){
return $this->cost;
}
function setActor($newActor){
$this->actor=$newActor;
}
function getActor(){
return $this->actor;
}
}
$movieInfo = new Movie();
$name = $movieInfo->setTitle("Long Walk To Freedom");
$director = $movieInfo->setDirector("Spielberg");
$cost = $movieInfo->setCost("$35Mil");
echo $name;
echo $director;
echo $cost;
错误
在第50行上缺少Movie :: __ construct()的参数1并在第18行中定义
因此它适用于每个属性,就像我说我试图进行大量调整一样,都会导致不同的错误。
我的问题
感谢您阅读
答案 0 :(得分:2)
我确切地知道你来自哪里。 OOP绝对是您必须尝试的概念之一,直到您进入“Eureka!”
让我们先解决你的构造函数。构造函数方法告诉对象在创建新的Movie实例时要执行的操作。您在第18行声明了一个构造函数方法,并告诉它需要$title
,$director
和$cost
个变量。然后,构造函数使用这些值来设置Movie类具有的属性。
错误在于,当您创建电影实例(第50行)时,它缺少参数。在第18行,你告诉Movie课,每当你创建一部电影时,它都需要$title
,$director
和$cost
,但是在第50行,你没有给出那些参数。当您传递三个适当的值(例如Movie("title", "director", cost)
)时,您应该停止收到错误。
现在让我们谈谈OOP。不确定您的问题是否具体要求public
属性,但编写此类的正确方法是封装类属性。封装允许您强制程序的其他部分通过方法以获取属性。这就是它的完成方式:
为private
和$title
设置public
属性getTitle
和setTitle
方法。这些方法将完全符合您的预期:返回或设置$title
的值。但为什么强制方法用于改变价值,而不是允许直接改变?这里的封装是有价值的。
通过强制程序的其他部分来完成该方法,您可以在更改值时自动执行操作。例如,您可能希望对尝试更改$title
值的用户进行身份验证,以确保他们具有正确的权限。或者您可能要验证$cost
仅包含整数值。或许你只是想让程序执行其他操作,比如改变颜色或者什么。当您强制访问属性以通过public
方法时,可能性是无穷无尽的。
最后,通过将属性设置为private
,可以改进代码。如果你有“getter and setter”方法,那么它们就没有意义public
,这使你可以更好地控制被改变的值。此外,由于您的构造函数应已设置$title
,$director
和$cost
,因此您不需要明确地执行此操作以获取输出你的echo
陈述。所以,这段代码:
$name = $movieInfo->setTitle("Long Walk To Freedom");
$director = $movieInfo->setDirector("Spielberg");
$cost = $movieInfo->setCost("$35Mil");
可以完全删除,如果您修改构造函数以在创建实例时传递这些值,那么它仍然可以正常工作。
答案 1 :(得分:1)
Movie
的构造函数需要三个参数$title
,$director
和$cost
。使用关键字new
创建类的实例时,将调用类构造函数,如果未定义构造函数,则会隐式调用默认的空构造函数。在这种情况下,您自己定义了一个构造函数,因此必须使用它。
$movieInfo = new Movie();
在这里,您尝试使用不存在的空构造函数,因为您已经定义了自己的构造函数。相反,您需要按$title
,$director
和$cost
$movieInfo = new Movie('Batman','Director Name', '5999');
此外,构造函数中的操作顺序不正确。您正在尝试使用实例变量分配构造函数的参数。你得到了这个,这是新的OO程序员犯下的一个常见错误。请记住,您希望使用传递给构造函数的参数构造对象实例(及其字段)。
function __construct($title, $director, $cost){
$this->title = $title;
$this->director = $director;
$this->cost = $cost;
}
也注意到了这一点:
$name = $movieInfo->setTitle("Long Walk To Freedom");
$director = $movieInfo->setDirector("Spielberg");
$cost = $movieInfo->setCost("$35Mil");
"设置器" (set方法)也称为" mutators",即它们会改变对象的状态,但不返回值。在这里,您试图设置标题,导演和成本,但是当他们不返回任何内容时,尝试使用这些方法中不存在的返回值。
当你想获得对象状态时,你可以使用" accessor"方法(" getters" / get方法)。这些返回对象状态。
$movieInfo->setTitle("Long Walk To Freedom");
$name = $movieInfo->getTitle();
//...etc
答案 2 :(得分:1)
首先,构造函数看起来不正确,你应该像this
一样赋值(你的方法错了)
function __construct($title, $director, $cost){
$this->title = $title;
$this->director = $director;
$this->cost = $cost;
}
您还需要在实例化对象时传入值,例如:
$movieInfo = new Movie('title', 'director', '$30');
当你可以将其他属性传递给构造函数时,它也有点奇怪。
答案 3 :(得分:0)
在你的第18行,你有一个构造函数
function __construct($title, $director, $cost){
$title = $this->title;
$director = $this->director;
$cost = $this->cost;
}
意味着您的类/对象期望$title, $director, $cost
的参数能够创建新对象MovieInfo。
你需要提供一个参数。
例如
$movieInfo = new Movie('The Long Walk to Freedom','Justin Chadwick','$35');