【问题标题】:PHP Class as a Parameter of another classPHP 类作为另一个类的参数
【发布时间】:2016-07-12 15:12:11
【问题描述】:

对于这个可能很简单的问题,我很抱歉,但我在网上找不到任何关于它的信息。我有两个类,为了这篇文章的目的,我们称它们为用户和地址,如下所示:

class user {
  public $firstName;
  public $lastName;
  public $address;
}

class address{
  public $streetAddress;
  public $streetName;
  public $city;
  public $state;
  public $zip;
}

在这种情况下,我希望用户类中的 $address 参数为第二类定义的“地址”类型。我可以在 PHP 中执行此操作吗?我的最终目标是能够使用这样的属性:

$userZip = $user->address->zip;

我是在正确的轨道上还是偏离了方向?

【问题讨论】:

  • 你试过了吗?属性可以是您想要的任何类型。所以答案是肯定的,你可以访问这样的属性。您只需要在构造函数中设置值。
  • 示例:codepad.org/woJEXbHm 编辑:我将缩进改为空格,以便于阅读。
  • Type hinting 尚未实现类属性(截至 php 7.0.4)。因此,我相信关于 pinning 属性类型您能做的最好的事情是:stackoverflow.com/questions/18956588/… ...如果 that 是您的实际问题。
  • 我相信他们要问的是一个类属性是否可以是另一个类的实例。简短的回答是肯定的。
  • 显然是这样 ;-) 评论“但这如何确定第一类中的参数是 $address 类型”让我失望。

标签: php


【解决方案1】:

这样试试;

<?php
class user {
    public $firstName='bulent';
    public $lastName ='kocaman';
    public $address;
    public function __construct()
    {
        $this->address = new address();
    }
}

class address{
    public $streetAddress=1;
    public $streetName=2;
    public $city=3;
    public $state=4;
    public $zip=5;
}

$user = new user();
print_r($user->address->zip);
?>

<?php
class user extends address{
    public $firstName='bulent';
    public $lastName ='kocaman';
}

class address{
    public $streetAddress=1;
    public $streetName=2;
    public $city=3;
    public $state=4;
    public $zip=5;
}

$user = new user();
print_r($user->zip);
?>

【讨论】:

  • 就是这样!非常感谢!
  • 不不不不不不!
  • @vascowhite 为什么“不”?你能解释一下吗?
  • 对不起,我本来打算今天早上回来扩展的。尽管您的答案在技术上是正确的,并且两个示例都可以使用,但它们存在一些问题。我强烈认为我们应该从一开始就教新的编码人员最佳实践,你的两个例子都是不好的做法,尤其是第二个。您的第一个示例在构造函数中实例化了一个类,这是一种蚂蚁模式并阻止了单元测试。在您的第二个示例中,您演示了从地址扩展用户。用户不是地址,用户地址,从这个角度来看,您的第一个示例更好。
【解决方案2】:
$address = new $address();

我相信这就是你要找的。​​p>

在 PHP 中,变量类型由分配给它们的数据定义。如果您希望类 1 中的 $address 为 $address 类型(类 2),那么您所要做的就是将其分配给 $address 的实例,它将采用该类型。然后,您将能够使用以下方法访问任何 $address 属性:

$user->address->zip

简而言之,是的,您在正确的轨道上。考虑将构造函数添加到您的类中。

【讨论】:

  • 我不相信他们问的是如何实例化一个对象,而是一个对象的属性是否可以引用另一个对象。
  • 这将创建一个新地址,但这如何确定第一个类中的参数是 $address 类型?
  • "我希望用户类中的 $address 参数是第二类定义的"地址"类型。"对我来说,它们似乎是。不过我可能是错的。
  • 谢谢 FireArrow5235!你是对的,我不知道如何构建一个构造函数,这是我所缺少的。
  • 很高兴我能帮上忙。公平地说,我本来可以更清楚地了解我最初的帖子。 xD
猜你喜欢
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2023-01-18
  • 2021-07-05
  • 2012-10-18
相关资源
最近更新 更多