2

PHPでクラス変数を割り当てて使用するためのより短い、より良い、またはよりクリーンな方法があるかどうか疑問に思っていました$this->instance_variable

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

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

私はすべてのPHPの変数スコープに精通しているわけではありませんが、公式ドキュメントで理解したことから、グローバルに定義するか、トラフにアクセスすることができます$this->か?それらをインスタンス変数として定義するキーワードがあるので、 Rubys @variableのようにアクセスできますか?

4

3 に答える 3

4

PHPにうまく変換されない、ルビーから持ってきたいくつかの重要な仮定があります。

PHPでオブジェクトプロパティ(Rubyのインスタンス変数と同等)を宣言して使用する正しい方法は次のとおりです。

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";
    }
}

PHPのOO構文は、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は、フォームを処理してHTMLを出力するためにいくつかのCコードをハックする簡単な方法として始まりました。PHPは下位互換性を保つために合理的な努力をしているため、$thisのような風変わりな回避策になってしまいます。

Rubyから来ると、少し冗長に見えますが、PHPの基本的な部分です。

于 2010-10-11T16:29:57.500 に答える
2

PHPインスタンスのプロパティには、内部的に演算子を介してアクセスし、$this->variableパブリックプロパティにはとしてアクセスします$object->property

self::$variableクラス変数には、Rubyのクラス変数と同様に、を介して内部的にアクセスできます。自己の議論::対$this->PHP

一般に、PHPは、特に変数を参照するために必要な文字に関して、Rubyよりもはるかに冗長であることがわかります。

于 2010-10-11T16:29:44.830 に答える
1

インスタンス変数(のような$foo)がある場合、それにアクセスする唯一の方法はを介することです$this->foo

必死に$foo =& $this->foo;なったら、同じ変数へのローカル参照があるように次のように書くこともできますが、唯一の利点は、混乱を増すことを犠牲にして数文字を節約することです。

于 2010-10-11T16:15:11.923 に答える