Почему я не могу получить доступ к защищенному свойству напрямую из своего класса?

Я новичок в PHP. Теперь я изучаю концепцию области видимости (также известную как модификаторы доступа).

Я прочитал следующие две ссылки также на этом форуме:

Не удалось получить свойство объекта, содержащее ": защищенный"

В чем разница между публичным, частным и защищенным?

Я создал простой класс в файле с именем «class.Address.inc»:

<?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 следующим образом:

require 'class.Address.inc';

echo '<h2>Instantiating Address</h2>';
$address = new Address;

echo '<h2>Empty Address</h2>';
echo '<tt><pre>' . var_export($address, TRUE) . '</pre></tt>';

echo '<h2>Setting properties...</h2>';
$address->street_address_1 = '555 Fake Street';
$address->city_name = 'Townsville';
$address->subdivision_name = 'State';
$address->postal_code = '12345';
$address->country_name = 'United States of America';
echo '<tt><pre>' . var_export($address, TRUE) . '</pre></tt>';

echo '<h2>Displaying address...</h2>';
echo $address->display();

echo '<h2>Testing protected access.</h2>';
echo "Address ID: {$address->_address_id}";

В вышеуказанной программе все работает, кроме последней строки. Я получаю фатальную ошибку, утверждая, что не могу получить доступ к свойству _address_id. Зачем?

Защищенная область — это когда вы хотите сделать свою переменную / функцию видимой во всех классах, которые расширяют текущий класс, включая родительский класс.

Объект «$ address» происходит из текущего класса с именем Address. Так что я делаю не так?

Пожалуйста помогите.

Qwerty

0

Решение

Код, который пытается получить доступ к защищенному свойству, должен быть в методе класса или класса, который его расширяет. echo Строка, о которой вы спрашиваете, не в каком-либо методе класса, а в глобальном коде скрипта. Защищенные и частные свойства не видны вне класса.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]