1. Php のアクセス制御
アクセス制御には次のものが含まれます: public、private、protected
アクセス制御 (可視性)
属性またはメソッドのアクセス制御は、キーワード public 、protected (保護された) または private を前に追加することによって行われます。 (私的)達成すること。 public として定義されたクラス メンバーにはどこからでもアクセスできます。 protected として定義されたクラス メンバーは、それ自体、そのサブクラス、およびその親クラスからアクセスできます。プライベートとして定義されたクラス メンバーには、そのメンバーが定義されているクラスのみがアクセスできます。
属性のアクセス制御
クラス属性は、public、protected、privateのいずれかとして定義する必要があります。 var で定義されている場合は、パブリックとみなされます。
例 #1 プロパティ宣言
<?php /** * Define MyClass */ class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new MyClass(); echo $obj->public; // 这行能被正常执行 echo $obj->protected; // 这行会产生一个致命错误 echo $obj->private; // 这行也会产生一个致命错误 $obj->printHello(); // 输出 Public、Protected 和 Private /** * Define MyClass2 */ class MyClass2 extends MyClass { // 可以对 public 和 protected 进行重定义,但 private 而不能 protected $protected = 'Protected2'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new MyClass2(); echo $obj2->public; // 这行能被正常执行 echo $obj2->private; // 未定义 private echo $obj2->protected; // 这行会产生一个致命错误 $obj2->printHello(); // 输出 Public、Protected2 和 Undefined ?>
注: 互換性の理由から、PHP 4 で var キーワードを使用して変数を定義する方法は、PHP 5 でも引き続き有効です (public キーワードのエイリアスとしてのみ)。 PHP 5.1.3 より前のバージョンでは、この構文により E_STRICT 警告が生成されました。
メソッドのアクセス制御
クラス内のメソッドは、パブリック、プライベート、または保護として定義できます。これらのキーワードが設定されていない場合、メソッドはデフォルトで public になります。
例 #2 メソッド宣言
<?php /** * Define MyClass */ class MyClass { // 声明一个公有的构造函数 public function construct() { } // 声明一个公有的方法 public function MyPublic() { } // 声明一个受保护的方法 protected function MyProtected() { } // 声明一个私有的方法 private function MyPrivate() { } // 此方法为公有 function Foo() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); } } $myclass = new MyClass; $myclass->MyPublic(); // 这行能被正常执行 $myclass->MyProtected(); // 这行会产生一个致命错误 $myclass->MyPrivate(); // 这行会产生一个致命错误 $myclass->Foo(); // 公有,受保护,私有都可以执行 /** * Define MyClass2 */ class MyClass2 extends MyClass { // 此方法为公有 function Foo2() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); // 这行会产生一个致命错误 } } $myclass2 = new MyClass2; $myclass2->MyPublic(); // 这行能被正常执行 $myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行 class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPrivate() { echo "Bar::testPrivate\n"; } } class Foo extends Bar { public function testPublic() { echo "Foo::testPublic\n"; } private function testPrivate() { echo "Foo::testPrivate\n"; } } $myFoo = new foo(); $myFoo->test(); // Bar::testPrivate // Foo::testPublic ?>
他のオブジェクトのアクセス制御
同じクラスのオブジェクトは、同じインスタンスでなくても、互いのプライベートメンバーと保護されたメンバーにアクセスできます。これは、これらのオブジェクトの内部実装の詳細がわかっているためです。
例 #3 同じオブジェクト タイプのプライベート メンバーにアクセスする
<?php class Test { private $foo; public function construct($foo) { $this->foo = $foo; } private function bar() { echo 'Accessed the private method.'; } public function baz(Test $other) { // We can change the private property: $other->foo = 'hello'; var_dump($other->foo); // We can also call the private method: $other->bar(); } } $test = new Test('test'); $test->baz(new Test('other')); ?>
上記のルーチンは次を出力します:
string(5) "hello" Accessed the private method.
3 静的キーワード
静的 (静的) キーワード
ヒント
このページでは、静的キーワードを使用して定義する方法について説明します。静的メソッドとプロパティ。 static は、静的変数の定義や静的バインディングの遅延にも使用できます。そこで static がどのように使用されているかについては、上記のページを参照してください。
クラス属性またはメソッドを静的として宣言すると、クラスをインスタンス化せずに直接アクセスできるようになります。インスタンス化されたクラスのオブジェクトを介して静的プロパティにアクセスすることはできません (ただし、静的メソッドはアクセスできます)。
PHP 4 との互換性のため、アクセス制御が指定されていない場合、プロパティとメソッドはデフォルトで public になります。
静的メソッドはオブジェクトを通じて呼び出す必要がないため、疑似変数 $this は静的メソッドでは使用できません。
静的プロパティには、演算子を介してオブジェクトからアクセスできません。
非静的メソッドを静的に呼び出すと、E_STRICT レベルのエラーが発生します。
他のすべての PHP 静的変数と同様、静的プロパティはリテラルまたは定数にのみ初期化でき、式には初期化できません。したがって、静的プロパティは整数または配列に初期化できますが、別の変数や関数の戻り値に初期化したり、オブジェクトを指すことはできません。
PHP 5.3.0 以降、変数を使用してクラスを動的に呼び出すことができます。ただし、この変数の値をキーワード self、parent、または static にすることはできません。
例 #1 静的プロパティの例
<?php class Foo { public static $my_static = 'foo'; public function staticValue() { return self::$my_static; } } class Bar extends Foo { public function fooStatic() { return parent::$my_static; } } print Foo::$my_static . "\n"; $foo = new Foo(); print $foo->staticValue() . "\n"; print $foo->my_static . "\n"; // Undefined "Property" my_static print $foo::$my_static . "\n"; $classname = 'Foo'; print $classname::$my_static . "\n"; // As of PHP 5.3.0 print Bar::$my_static . "\n"; $bar = new Bar(); print $bar->fooStatic() . "\n"; ?> </programlisting> </example> <example> <title>静态方法示例</title> <programlisting role="php"> <![CDATA[ <?php class Foo { public static function aStaticMethod() { // ... } } Foo::aStaticMethod(); $classname = 'Foo'; $classname::aStaticMethod(); // 自 PHP 5.3.0 起 ?>
以上がphp: アクセス制御と静的キーワードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。