Простой PHP класс вопросов - PullRequest
       6

Простой PHP класс вопросов

2 голосов
/ 20 августа 2009

Итак, у меня есть:

class foo {
  public $variable_one;
  public $variable_two;

  function_A(){
    // Do something
    $variable_one;
    $variable_two;

    // If I define variable_3 here!
    $variable_3
    // Would I be able to access it in function_B?
  }

  function_B(){
    // Do something
    $variable_4 = $variable_3
  }
}


$myObj = new foo();
// Now what do I write in order to assign "variable_one" and "two" some value?
$myObj->$variable_one = 'some_value' ??
$myObj->$variable_two = 'some_value' ??

Ответы [ 5 ]

7 голосов
/ 20 августа 2009

Во-первых, когда вы пишете просто $variable_one; внутри A(), оно не ссылается на переменные-члены вашего класса! Это была бы совершенно другая, недавно созданная локальная переменная с именем $variable_one, не имеющая отношения к переменной класса.

Вместо этого вы хотите:

function A() {
    $this->variable_one;
}

Во-вторых, ваша $variable_3 также является локальной переменной, и не будет доступной в любой другой функции.

В-третьих, ваши назначения внизу верны по форме, но не по синтаксису: там есть дополнительный $. Вы хотите:

$myObj->variable_one = 'some value';
2 голосов
/ 20 августа 2009

Нет, $variable_3 было создано (и будет уничтожено) в области действия function_A. Это связано с областью действия функции.

http://us3.php.net/manual/en/language.variables.scope.php

Если вы хотите, чтобы $ variable_3 был сохранен вашим объектом после того, как выполнение покидает область действия function_A, вам нужно назначить его как свойство класса, аналогично $ variable_1 и $ variable2.

class YourClass
{

    public $variable_1;
    public $variable_2;
    public $variable_3;

    function_A()
    {
        $this->variable_3 = "some value"; // assign to the object property
        $variable_4 = "another value"; // will be local to this method only
    }

    function_B()
    {
        echo $this->variable_3; // Would output "some value"
        echo $variable_4; // var does not exist within the scope of function_B
    }

}
1 голос
/ 20 августа 2009

Правильный код будет следующим (см. Ответ в комментариях)

class foo {
  public $variable_one;
  public $variable_two;
  private $variable_three; // private because it is only used within the class

  function _A(){
    // using $this-> because you want to use the value you assigned  at the
    // bottom of the script. If you do not use $this-> in front of the variable, 
    // it will be a local variable, which means it will be only available inside
    // the current function which in this case is _A
    $this->variable_one; 
    $this->variable_two;

    // You need to use $this-> here as well because the variable_3 is used in
    // function _B
    $this->variable_3;
  }

  function _B(){
    // Do something
    $variable_4 = $this->variable_3
  }
}


$myObj = new foo();
$myObj->variable_one = 'some_value1'; // Notice no $ in front of the var name
$myObj->variable_two = 'some_value2'; // Notice no $ in front of the var name

Переменные (свойства) класса должны быть доступны с использованием префикса $ this->, если они не являются статическими (в вашем примере это не так). Если вы не используете префикс $ this->, они будут локальными переменными в функции, которую вы их определяете.

Надеюсь, это поможет!

1 голос
/ 20 августа 2009
$myObj->variable_one = aValue;
$myObj->variable_two = anotherValue;
0 голосов
/ 20 августа 2009

Если variable_one и variable_two равны public, вы можете назначить их так, как вы указали (просто удалите "$" ... so $ classObject-> variable_one). Обычно вы хотите инкапсулировать ваших переменных, делая их либо защищенными, либо личными:

class MyClass
{
    protected $_variable_one;

    public function getVariableOne()
    {
        return $this->_variable_one;
    }

    public function setVariableOne($value)
    {
        $this->_variable_one = $value;
    }
}

$c = new MyClass();
$c->setVariableOne("hello!");

echo $c->getVariableOne(); // hello!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...