【问题标题】:Accessing a member of an object within a class in PHP在 PHP 中访问类中对象的成员
【发布时间】:2009-04-22 15:25:06
【问题描述】:

我的代码:

class Address{
   public var $Street;
}

class Employee{
    public var $ID:
    public var $Name:
    public var $Address;
}

$myEmployee = new Employee();
$myEmployee->Address = new Address();

我现在如何进入这条街?

$street = $myEmployee->$Address->Street;
$street = $myEmployee->Address->Street;

两者都在 Eclipse 中给我警告。我在想:

$street = $myEmployee['Address']->Street;

这对吗?

【问题讨论】:

  • 好的谢谢所有的回复!主要关心的其实是,为什么 Eclipse 不执行代码补全?

标签: php class object


【解决方案1】:

如前所述,您的使用建议:

$street = $myEmployee->Address->Street;

完全有效。但是,您的代码中存在一些可能导致问题的错误。首先,公共成员变量可以这样声明:

public $id;

或者这个(已弃用):

var $id;

这两者的组合不是有效的 PHP 代码。

另外,行尾有两个冒号 (:),应该是分号 (;)。

希望有帮助!

【讨论】:

    【解决方案2】:
    $myEmployee->Address->Street;
    

    这是有效的,Eclipse 的警告系统对于这样的事情非常奇怪。在这种情况下,我通常会关闭它们,让 PHP 为我做错误报告。

    此外,eclipse 不支持自动完成您需要做的事情。

    【讨论】:

    • 愚蠢的问题,但不是 Eclipse 自动完成?应该可以改正吧?
    【解决方案3】:
    $street = $myEmployee->Address->Street;
    

    应该可以。无论如何,Eclipse 抱怨什么?

    【讨论】:

    • 抱歉,没有警告信息,但它不会自动完成。 PHP Plugin for Eclipse 不支持这个吗?
    【解决方案4】:

    另一种方法是使用访问器和私有数据成员:

    class Address {
       private $Street;
    
       public function __construct() {}
    
       public function setStreet($Street) {
           $this->Street = $Street;
       }
    
       public function getStreet() {
          return $this->Street;
       }
    }
    
    /* ... same for Employee ... */
    
    $myEmployee = new Employee();
    $myEmployee->setAddress(new Address());
    
    $street = $myEmployee->getAddress()->getStreet();
    

    这将为您提供封装,以防您以后需要更改内部实现。如果您将类成员公开为公共数据成员,那么一旦客户端代码开始使用您的类,您就会被锁定。

    这样重构会更容易,而且它也会消除你的警告。

    【讨论】:

      【解决方案5】:

      缺少Eclipse代码补全的原因是代码补全需要类型信息。

      在 PHP 中,这可以通过 type hints 和注释注释来完成。

      我不确定您使用的是什么 Eclipse 插件,但如果是 PDT,请查看 code assist 的手册:

      那么一个简单的注释注释就是:

      您可以在 Employee 之上添加:

      /**
       * @property Address $Address
       */
      class Employee 
      ....
      

      【讨论】:

        【解决方案6】:

        为什么不在Employee类的构造函数中创建Address呢?我猜你最终会创建多个员工,而不是每次都有两行来创建员工和地址,你可以创建一个员工并陶醉于地址已经存在的舒适感创建并存储在 $myEmployee->Address 中。

        【讨论】:

          猜你喜欢
          • 2015-12-27
          • 2011-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多