第二年的IT学生 - 与OOP概念挣扎

时间:2016-05-07 15:08:56

标签: php oop

背景

如标题中标题所述,我是第二年的IT学生,我们刚开始使用PHP编程模块。

过去我曾经和PHP合作过很多次。我熟悉使用函数等的基础知识,但习惯OOP对我来说是一个全新的球类游戏。

我真的很难将OOP的基础知识降下来,我的意思是我理解了我的理解...... 我只需要那个灯泡继续这就是我的意思希望有人可以帮助我。

问题 enter image description here enter image description here

我的代码

我有点惭愧发布我提出的代码到下面的问题,我做了很多调整,并在我的规定的书中多次阅读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行中定义

因此它适用于每个属性,就像我说我试图进行大量调整一样,都会导致不同的错误。

我的问题

  1. 我希望有人可以在这里指出我正确的方向,希望能让我得到那个灯泡时刻(“我失去的那就是那个”)
  2. 上述代码到底出了什么问题?
  3. 如何以初学者的方式改进?
  4. 感谢您阅读

4 个答案:

答案 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属性getTitlesetTitle方法。这些方法将完全符合您的预期:返回或设置$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

的顺序传入expect中的参数
$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');