Php 二年级IT专业学生-与OOP概念抗争

Php 二年级IT专业学生-与OOP概念抗争,php,oop,Php,Oop,背景 正如标题中提到的,我是一名IT专业的二年级学生,我们刚刚开始学习PHP编程模块 我过去曾多次使用PHP&我熟悉使用函数等的基础知识,但对我来说,习惯OOP是一个全新的游戏。 我真的很难理解OOP的基本原理,我的意思是我明白了我理解这个概念…我只需要那个灯泡就行了,这就是我希望有人能帮助我的原因 问题 我的代码 我有点不好意思把我想到的代码贴到下面的问题上,我做了很多调整,在我指定的书中读了很多次OOP页面,但是我不断地出错,所以我想我别无选择 class Movie{ publi

背景

正如标题中提到的,我是一名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行中定义

所以它适用于每一个属性,就像我说的,我尝试了许多调整,所有这些都会导致不同的错误

我的问题

  • 我希望有人能给我指出正确的方向,希望能让我得到那一刻(“啊,这就是我一直错过的”)
  • 上面的代码到底出了什么问题
  • 如何以初学者友好的方式改进它

  • 感谢您阅读第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');
    

    在第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');
    

    Movie
    的构造函数需要三个参数
    $title
    $director
    $cost
    。使用关键字
    new
    创建类实例时,将调用类构造函数,如果未定义构造函数,则隐式调用默认的空构造函数。在本例中,您自己定义了一个构造函数,因此必须使用它

    $movieInfo = new Movie();
    
    这里您试图使用一个不存在的空构造函数,因为您已经定义了自己的构造函数。相反,您需要按照
    $title
    $director
    $cost
    的顺序在expects中传递参数

    $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");
    
    “setters”(set方法)也称为“mutators”,也就是说,它们改变对象的状态,但不返回值。在这里,您试图设置标题、主管和成本,但当这些方法不返回任何内容时,尝试使用这些方法不存在的返回值

    当您想要获取对象状态时,可以使用“accessor”方法(“getter”/get方法)。这些函数返回对象状态

    $movieInfo->setTitle("Long Walk To Freedom");
    $name = $movieInfo->getTitle();
    //...etc
    

    Movie
    的构造函数需要三个参数
    $title
    $director
    $cost
    。使用关键字
    new
    创建类实例时,将调用类构造函数,如果未定义构造函数,则隐式调用默认的空构造函数。在本例中,您自己定义了一个构造函数,因此必须使用它

    $movieInfo = new Movie();
    
    这里您试图使用一个不存在的空构造函数,因为您已经定义了自己的构造函数。相反,您需要按照
    $title
    $director
    $cost
    的顺序在expects中传递参数

    $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");
    
    “setters”(set方法)也称为“mutators”,也就是说,它们改变对象的状态,但不返回值。在这里,您试图设置标题、主管和成本,但当这些方法不返回任何内容时,尝试使用这些方法不存在的返回值

    当您想要获取对象状态时,可以使用“accessor”方法(“getter”/get方法)。这些函数返回对象状态

    $movieInfo->setTitle("Long Walk To Freedom");
    $name = $movieInfo->getTitle();
    //...etc
    

    首先,构造函数看起来不正确,您应该将值赋给
    this
    like(您的方法不对)

    此外,实例化对象时还需要传入值,如:

    $movieInfo = new Movie('title', 'director', '$30');
    

    还有一点奇怪的是,当你可以为其他属性传递一个actor时,你却不能将它传递到构造函数中。

    首先,构造函数看起来不正确,你应该给这个
    赋值(你的方法不对)

    此外,实例化对象时还需要传入值,如:

    $movieInfo = new Movie('title', 'director', '$30');
    

    还有一点奇怪的是,当你可以为其他属性传递一个actor时,却不能将它传递到构造函数中。

    我确切地知道你是从哪里来的。OOP绝对是其中一个概念,你只需尝试,直到你达到“Eureka!”

    让我们先介绍一下你的构造函数。构造函数方法告诉对象在创建新的Movie实例时要做什么。您在第18行声明了一个构造函数方法,并告诉它使用
    $title
    <