代码之家  ›  专栏  ›  技术社区  ›  martin

在PHP中访问类中对象的成员

  •  0
  • martin  · 技术社区  · 17 年前

    我的代码:

    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;
    

    在日食中,它们都会给我警告。我在想:

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

    这是正确的吗?

    6 回复  |  直到 17 年前
        1
  •  5
  •   George Crawford    17 年前

    如前所述,您建议使用:

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

    完全有效。但是,您的代码中有一些错误可能导致了这些问题。首先,公共成员变量要么声明如下:

    public $id;
    

    或此(已弃用):

    var $id;
    

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

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

    希望有帮助!

        2
  •  5
  •   Ólafur Waage    17 年前
    $myEmployee->Address->Street;
    

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

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

        3
  •  3
  •   Mike Hordecki    17 年前
    $street = $myEmployee->Address->Street;
    

    应该工作。不管怎样,Eclipse抱怨什么?

        4
  •  0
  •   Rob Hruska MegalomanINA    17 年前

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

    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
  •  0
  •   TK.    17 年前

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

    在PHP中,这可以通过 type hints 以及注释。

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

    一个简单的注释注释是:

    您可以在上面添加:

    /**
     * @property Address $Address
     */
    class Employee 
    ....
    
        6
  •  0
  •   Stephen Walcher    17 年前

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

    推荐文章