private var не работает как положено в классе php - PullRequest
2 голосов
/ 10 декабря 2011

В приведенном ниже примере я получаю сообщение о том, что значение $foo->_test недоступно, поскольку оно является закрытым.Что я делаю не так?

<?php
$foo = new Bar;
$foo->test();
print_r( $foo->_test );

class Foo
{
    private $_test = array();
}


class Bar extends Foo
{
    public function test()
    {
        $this->_test = 'opa';
    }
}
?>

Любая помощь приветствуется.

Ответы [ 3 ]

5 голосов
/ 10 декабря 2011

Закрытые переменные видны только прямому классу, в котором они объявлены.То, что вы ищете, это protected. Без этого вы эффективно создаете две разные переменные-члены в вашем объекте.

class Foo
{
    protected $_test = array();
}

class Bar extends Foo
{
    public function test()
    {
        $this->_test = 'opa';
    }
}

[править] Вы также пытаетесь получить доступ к закрытой (скоро будет защищенной) переменной-члену вне класса.Это всегда будет запрещено.За исключением этого случая, вы создаете вторую переменную-член public, поэтому ошибка не отображается.Вы не упомянули, что ожидали увидеть ошибку, поэтому я предполагаю, что это был вопрос, который у вас возник.

[править]

вот дамп var:

object(Bar)#1 (2) {
  ["_test:private"]=>
  array(0) {
  }
  ["_test"]=>
  string(3) "opa"
}

[править]

Одна вещь, которую я сделал в рамках, который я написал, - это создание базового класса, который я расширяю почти везде.Одна вещь, которую делает этот класс, - это использование методов __get и __set для принудительного объявления переменных-членов класса - это помогает сузить проблемы с кодом, такие как у вас.

<?

abstract class tgsfBase
{
    public function __get( $name )
    {
        throw new Exception( 'Undefined class member "' . $name . "\"\nYou must declare all variables you'll be using in the class definition." );
    }
    //------------------------------------------------------------------------
    public function __set( $name, $value )
    {
        throw new Exception( 'SET: Undeclared class variable ' . $name . "\nYou must declare all variables you'll be using in the class definition." );
    }

}

class Foo extends tgsfBase
{
    private $_test = array();
}

class Bar extends Foo
{
    public function test()
    {
        $this->_test = 'opa';
    }
}

header( 'content-type:text/plain');

$foo = new Bar;
$foo->test();
var_dump( $foo );
print_r( $foo->_test );
0 голосов
/ 10 декабря 2011

Когда вы напишите var_dump($foo); ниже $foo->teste();, вы получите полную идею.

Здесь PHP создал 2 переменные с именем _testando , один из них имеет значение private = array (), а другой - значение public = opa.

Напишите это:

private $_testando_new = '';

над публичной функцией teste ()

и заменить $this->_testando = 'opa'; на $this->_testando_new = 'opa';

и попытайтесь получить доступ к переменной _testando_new вне класса, вы получите ошибку.

Bye.

0 голосов
/ 10 декабря 2011

Частный участник не является visible в своих подклассах. Для получения дополнительной информации прочитайте Манаул . Добавьте var_dump () для проверки структуры объекта.

<?php
  $foo = new Bar;
  $foo->teste();
  print_r( $foo->_testando );
  var_dump( $foo);

  class Foo
  {
    private $_testando = array();
   }
 class Bar extends Foo
  {
  public function teste()
   {
   $this->_testando  = 'opa';  // a new member of string type will be created 
   }
 }
?>
...