PHP эквивалентно Rubin's @instance_variable? - PullRequest
2 голосов
/ 11 октября 2010

Мне было интересно, если есть более короткий, лучший или более чистый способ присваивать и использовать переменные класса в PHP, то через $this->instance_variable?

class Bar {
  #  internal variables
  var $foo = "Hello World";

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

Я не очень знаком со всей областью видимости переменных PHP, но из того, что я понял в официальных документах, вы можете определить их как глобальные или получить к ним доступ через $this->?Есть ли ключевое слово, чтобы определить их как переменную экземпляра, чтобы они были доступны как Rubys @ variable ?

Ответы [ 3 ]

4 голосов
/ 11 октября 2010

Есть несколько ключевых предположений, которые вы привели из ruby, которые плохо переводятся в PHP.

Правильный способ объявления и использования свойств объекта (эквивалентных переменным экземпляра Ruby) в PHP:

class Foo
{
    //accesible from inside this objects of this class, 
    //objects that have this class as an ancestor, and from
    //outside the object  
    //var $bar; is equivalent.  "var" is PHP 4 syntax, 
    //when everything was public
    public $bar;

    //accesible from inside this objects of this class, 
    //objects that have this class as an ancestor  
    protected $baz;

    //accesible from inside this objects only
    private $fiz;

    protected function example()
    {
        echo $this->bar . "\n";
        echo $this->baz . "\n";
        echo $this->fiz . "\n";
    }
}

Синтаксис OO в PHP основан на представлении о мире Java / C #. Однако, поскольку каждая PHP-страница / скрипт / программа запускается в общем счете, необходима псевдо-ссылка $this на локальный объект. Без этого вы бы создали большую степень неопределенности вокруг таких ситуаций, как эта

//In main.php
$foo = "bar";
include('example.php');

//in example.php
class Example
{
    public $foo="baz";
    public function scopeIsHardLetsGoShopping()
    {
        global $foo;
        echo $foo;
    }
}

Итак, в методе должна указываться ссылка на $ foo - объектная переменная или глобальная переменная? Если вы говорите, что это должна быть переменная объекта, как вы обращаетесь к глобальному foo из метода? Если вы говорите, что это должна быть глобальная переменная, как вы обращаетесь к локальному свойству после объявления переменной с тем же именем, что и глобальное?

Ruby и python дали некоторое представление о начале языка, поэтому этих проблем можно избежать. PHP начинался как быстрый способ взломать некоторый c-код для обработки форм и вывода HTML. Поскольку PHP прилагает разумные усилия для обеспечения обратной совместимости, в итоге вы получаете причудливый обходной путь, например $ this.

Форма Ruby кажется немного многословной, но это фундаментальная часть PHP.

2 голосов
/ 11 октября 2010

Свойства экземпляра PHP доступны через внутренний оператор $this->variable, а открытые свойства - $object->property.

Вы можете получить доступ к внутренней переменной класса через self::$variable, что аналогично переменным класса Ruby. Обсуждение self :: vs. $ this-> в PHP

В общем, вы найдете PHP гораздо более многословным, чем Ruby, не в последнюю очередь в отношении символов, необходимых для ссылки на переменную.

1 голос
/ 11 октября 2010

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

Вы можете, в случае отчаяния, написать что-то вроде $foo =& $this->foo;, чтобы вы имелилокальная ссылка на ту же переменную, но единственным преимуществом является сохранение нескольких символов за счет дополнительной путаницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...