关于php:为什么我不能直接从自己的类访问受保护的属性?

Why I can`t access a protected property from its own class directly?

我对PHP不熟悉。我现在学习可见性范围概念(也称为访问修饰符)。

我在这个论坛上也看到了以下两个链接:

未能获取包含":protected"的对象属性

公共、私人和受保护之间有什么区别?

我在名为"class.address.inc"的文件中创建了一个简单类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php

/**
 * Physical address.
 */

class Address {
  // Street address.
  public $street_address_1;
  public $street_address_2;

  // Name of the City.
  public $city_name;

  // Name of the subdivison.
  public $subdivision_name;

  // Postal code.
  public $postal_code;

  // Name of the Country.
  public $country_name;

  // Primary key of an Address.
  protected $_address_id;

  // When the record was created and last updated.
  protected $_time_created;
  protected $_time_updated;

  /**
   * Display an address in HTML.
   * @return string
   */

  function display() {
    $output = '';

    // Street address.
    $output .= $this->street_address_1;
    if ($this->street_address_2) {
      $output .= '<br/>' . $this->street_address_2;
    }

    // City, Subdivision Postal.
    $output .= '<br/>';
    $output .= $this->city_name . ', ' . $this->subdivision_name;
    $output .= ' ' . $this->postal_code;

    // Country.
    $output .= '<br/>';
    $output .= $this->country_name;

    return $output;
  }
}

然后,我在demo.php文件中创建了一个简单的程序,如下所示:

1
2
3
4
5
6
7
require 'class.Address.inc';

echo 'Instantiating Address';
$address = new Address;

echo 'Empty Address';
echo '<tt>[cc lang="php"]' . var_export($address, TRUE) . '

的='tt>';echo"设置属性…"$address->street_address_1='555假街道';$address->city_name='townsville';$address->subdivision_name='state';$address->邮政编码='12345';$address->country_name='美利坚合众国';echo'

1
' . var_export($address, TRUE) . '

';echo"显示地址…"echo$address->display();echo"测试受保护的访问";echo"地址ID:$address->_address_id"< /代码>

除了最后一行以外,上面的程序中的所有内容都可以工作。我收到一个致命错误,说我不能访问"地址"属性。为什么?

当您希望使变量/函数在扩展当前类(包括父类)的所有类中都可见时,保护范围即为。

"$address"对象来自当前名为address的类。我做错了什么?

请协助。

QWERTY


试图访问受保护属性的代码必须位于类的方法或扩展该方法的类中。您询问的echo行不在任何类方法中,它在脚本的全局代码中。保护属性和私有属性在类外部不可见。