PHP将一个类传递给另一个类构造函数

TLG123

在 Google 和这个网站上搜索了很长时间后,我非常紧张,似乎无法完成这项基本任务(Java 非常简单),但是使用 PHP 我很难。有人可以告诉我我做错了什么。我想要的只是将 Job 类传递到 Person 类中,并将它们链接在一起,但我正在努力掌握它,尝试各种其他途径来实现它。

<?php

class Person{
    public $name;

    public function __construct($name, Job $job){
        $this->name = $name;
        $this->job = $job;
    }

    public function display(){
        return $this->name . $this->job;
    }
}

class Job{
    public $job;

    public function __construct($job){
        $this->job = $job;
    }
}

$job = new Job("Programmer");
$person = new Person("John");

echo $person->display();

?>

用户7941334

问题是,您是否需要将Job实例(作为依赖项)传递给Person对象,如果它仅与作业名称有关 - 就像在以下上下文中一样?我会说不是:

class Person {

    /**
     * Person name.
     *
     * @var string
     */
    private $name;

    /**
     * Job name.
     *
     * @var string
     */
    private $job;

    /**
     * Person's age.
     *
     * @var int
     */
    private $age;

    /**
     * Person's place of birth.
     *
     * @var string
     */
    private $birthPlace;

    /**
     * Job name.
     *
     * @param string $name Person name.
     * @param string $job Job name.
     * @param int $age Person's age.
     * @param string $birthPlace Person's place of birth.
     */
    public function __construct(string $name, string $job, int age, string $birthPlace) {
        $this->name = $name;
        $this->job = $job;
        $this->age = $age;
        $this->birthPlace = $birthPlace;
    }

    /**
     * Get person's details.
     * 
     * @return string
     */
    public function getDetails() {
        return $this->name . ', ' . $this->job . ', ' . $this->age . ', ' . $this->birthPlace;
    }

}

use Person;

$person = new Person('TLG', 'programmer', 28, 'Paris');

echo $person->getDetails();

但是,如果将更具体的工作细节分配给一个人呢?然后可以使用Job实例:

/*
 * Job.
 */

class Job {

    /**
     * Job name.
     *
     * @var string
     */
    private $name;

    /**
     * Job location.
     *
     * @var string
     */
    private $location;

    /**
     * 
     * @param string $name Job name.
     * @param string $location Job location.
     */
    public function __construct(string $name, string $location) {
        $this->name = $name;
        $this->location = $location;
    }

    /**
     * Get the job name.
     * 
     * @return string
     */
    public function getName() {
        return $this->name;
    }

    /**
     * Get the job location.
     * 
     * @return string
     */
    public function getLocation() {
        return $this->location;
    }

}


/*
 * Person.
 */

use Job;

class Person {

    /**
     * Person name.
     *
     * @var string
     */
    private $name;

    /**
     * Job instance.
     *
     * @var Job
     */
    private $job;

    /**
     * 
     * @param string $name Person name.
     * @param Job $job Job instance.
     */
    public function __construct(string $name, Job $job) {
        $this->name = $name;
        $this->job = $job;
    }

    /**
     * Get person's details.
     * 
     * @return string
     */
    public function getDetails() {
        return $this->name . ', ' . $this->job->getName() . ' in ' . $this->job->getLocation();
    }

}


/*
 * The call.
 */

use Job;
use Person;

$job = new Job('Programmer', 'London');
$person = new Person('John', $job);

echo $person->getDetails();

笔记:

  • 您应该将所有属性设为私有对于需要从外部访问的那些创建公共getter/setter,以确保封装
  • 您应该使用命名空间。在这种情况下,由于两个类都在全局命名空间中定义,因此您不需要导入任何类,例如使用以use关键字开头的语句但是,在其他需要定义顶级命名空间命名空间的情况下,您绝对应该使用 import 语句。它们将为您提供一种非常优雅的方式来操作类名并提高类代码的可读性。参见PSR-1:基本编码标准PSR-2:编码风格指南PSR-4:自动加载器

现在,如果一个人可以有多个工作怎么办?然后你可以使用JobCollection

 /*
 * Job.
 */

class Job {

    // Same as above...

}


/*
 * Job collection.
 */

use Job;

class JobCollection {

    /**
     * Jobs list.
     *
     * @var Job[]
     */
    private $jobs = [];

    /**
     * Add a job.
     * 
     * @return $this
     */
    public function add(Job $job) {
        $this->jobs[] = $job;
        return $this;
    }

    /**
     * Get all jobs.
     * 
     * @return Job[]
     */
    public function all() {
        return $this->jobs;
    }

}


/*
 * Person.
 */

use JobCollection;

class Person {

    /**
     * Person name.
     *
     * @var string
     */
    private $name;

    /**
     * Job collection.
     *
     * @var JobCollection
     */
    private $jobs;

    /**
     * 
     * @param string $name Person name.
     * @param JobCollection $jobs Job collection.
     */
    public function __construct(string $name, JobCollection $jobs) {
        $this->name = $name;
        $this->jobs = $jobs;
    }

    /**
     * Get the person name.
     * 
     * @return string
     */
    public function getName() {
        return $this->name;
    }

    /**
     * Get the person's jobs.
     * 
     * @return Job[]
     */
    public function getJobs() {
        return $this->jobs->all();
    }

    /**
     * Get person's details.
     * 
     * @return string
     */
    public function getDetails() {
        $result = $this->getName() . '<br/>';

        foreach ($this->jobs->all() as $job) {
            $result .= $job->getName() . ' in ' . $job->getLocation() . '<br/>';
        }

        return $result;
    }

}


/*
 * The call.
 */

use Job;
use Person;
use JobCollection;

// Create some jobs.
$job1 = new Job('Programmer', 'London');
$job2 = new Job('Bartender', 'Paris');

// Create the job collection and add the jobs to it.
$jobs = new JobCollection();
$jobs
        ->add($job1)
        ->add($job2)
;

// Create the person.
$person = new Person('John', $jobs);

echo $person->getDetails();

得墨忒耳定律,在极大地给出清洁代号会谈-不看的东西!, 指定您应该只注入类直接使用的依赖项。例如,您不应该传递具有中介作用的依赖项,例如,这些依赖项仅用于创建您需要调用其方法的其他对象。

在我回答的早期版本中,我给您的印象是Person对象中使用Job实例来分配作业名称是错误的。使用Job实例是正确的通过使用它,你不打破毁灭之王本身,而只是它的细微差别,你并不真的需要一个工作实例,以便将作业名分配到对象(如在我的第一个例子),如果作业并不意味着更具体的情况(如第二个示例和评论中的好问题)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用构造函数将一个类传递给另一个类

来自分类Dev

C ++试图将类传递给另一个类的构造函数

来自分类Dev

将模板类实例传递给另一个类的构造函数

来自分类Dev

将模板类的对象传递给另一个类的构造函数

来自分类Dev

如何将编写的对象传递给另一个类的构造函数?

来自分类Dev

使用构造函数将驱动程序实例传递给另一个类

来自分类Dev

从另一个类的构造函数将数组传递到类函数中

来自分类Dev

将数组传递给另一个类

来自分类Dev

将类函数指针传递给另一个类

来自分类Dev

将一个类中的数据传递给另一个类中的函数

来自分类Dev

将一个类传递给另一个类(Python)

来自分类Dev

将一个类的对象传递给另一个类的方法

来自分类Dev

将一个类传递给另一个类

来自分类Dev

无法将变量从类中的函数传递给Swift中的另一个函数

来自分类Dev

Angular 6 - 尝试将函数传递给另一个类中的函数

来自分类Dev

将动态值从一个函数传递给类中的另一个函数

来自分类Dev

C ++:如何将指针传递给另一个类的成员函数?

来自分类Dev

如何使用IoC将函数传递给另一个类

来自分类Dev

将所有类方法传递给Ruby on Rails中的另一个函数

来自分类Dev

将类的实例传递给另一个构造函数,该构造函数将其对象添加到所传递的实例拥有的列表中

来自分类Dev

将指向一个派生类的指针传递给另一个

来自分类Dev

试图将一个对象的实例传递给另一个类

来自分类Dev

Java-试图使用在另一个类中传递给另一个构造函数的参数来初始化对象?

来自分类Dev

如何将对象的动态数组传递给另一个类的参数化构造函数?

来自分类Dev

我如何将类方法传递给另一个函数,例如线程构造函数中发生的情况

来自分类Dev

通过另一个类将对象传递给一个类

来自分类Dev

将当前类的对象传递给另一个类

来自分类Dev

将类及其功能传递给另一个类

来自分类Dev

gmock:如何将模拟类的指针传递给另一个类?

Related 相关文章

  1. 1

    使用构造函数将一个类传递给另一个类

  2. 2

    C ++试图将类传递给另一个类的构造函数

  3. 3

    将模板类实例传递给另一个类的构造函数

  4. 4

    将模板类的对象传递给另一个类的构造函数

  5. 5

    如何将编写的对象传递给另一个类的构造函数?

  6. 6

    使用构造函数将驱动程序实例传递给另一个类

  7. 7

    从另一个类的构造函数将数组传递到类函数中

  8. 8

    将数组传递给另一个类

  9. 9

    将类函数指针传递给另一个类

  10. 10

    将一个类中的数据传递给另一个类中的函数

  11. 11

    将一个类传递给另一个类(Python)

  12. 12

    将一个类的对象传递给另一个类的方法

  13. 13

    将一个类传递给另一个类

  14. 14

    无法将变量从类中的函数传递给Swift中的另一个函数

  15. 15

    Angular 6 - 尝试将函数传递给另一个类中的函数

  16. 16

    将动态值从一个函数传递给类中的另一个函数

  17. 17

    C ++:如何将指针传递给另一个类的成员函数?

  18. 18

    如何使用IoC将函数传递给另一个类

  19. 19

    将所有类方法传递给Ruby on Rails中的另一个函数

  20. 20

    将类的实例传递给另一个构造函数,该构造函数将其对象添加到所传递的实例拥有的列表中

  21. 21

    将指向一个派生类的指针传递给另一个

  22. 22

    试图将一个对象的实例传递给另一个类

  23. 23

    Java-试图使用在另一个类中传递给另一个构造函数的参数来初始化对象?

  24. 24

    如何将对象的动态数组传递给另一个类的参数化构造函数?

  25. 25

    我如何将类方法传递给另一个函数,例如线程构造函数中发生的情况

  26. 26

    通过另一个类将对象传递给一个类

  27. 27

    将当前类的对象传递给另一个类

  28. 28

    将类及其功能传递给另一个类

  29. 29

    gmock:如何将模拟类的指针传递给另一个类?

热门标签

归档