PHP アクセス制御の概要
1. 属性アクセス制御
PHP では、クラス属性を public として定義する必要があります (次のいずれか) 3 つ: パブリック、プロテクト、またはプライベート。 PHP4 では、var キーワードを使用して属性を定義できますが、デフォルトではパブリックではありません。 public として定義されたクラス メンバーにはどこからでもアクセスできます。保護されたものとして定義されたクラス メンバーは、それ自体、そのサブクラス、および親クラスからアクセスできます。プライベートとして定義されたクラス メンバーには、そのメンバーが定義されているクラスのみがアクセスできます。
var キーワードに興味がある場合は、http://stackoverflow.com/ques...
class Foo() { $name = "hello world" # 这么写是错误的。属性必须定义访问控制 }
2 を参照してください。メソッド アクセス制御
同様に、クラス内のメソッドも、public、protected、または private の 3 つのいずれかとして定義できます。ただし、public の場合は、メソッドの前に public キーワードを記述する必要はありません。つまり、キー時間を書き込まない場合、デフォルトは public になります。
例:
class Bar() { function hello() # 此时该方法默认为公有 { print("hello"); } }
それでは、クラス内のコンストラクターがプライベートにされた場合はどうなるでしょうか?例:
class Demo() { private function __construct() { print("I'm a private construct function"); } }
当然のことですが、インスタンスの作成時に __construct() メソッドが外部から呼び出されるため、 new Demo() を直接使用してインスタンスを作成することはできません。何をするか?クラス内に静的メソッドを記述してインスタンス オブジェクトを取得できる場合があります。このようにして、外部でインスタンス化せずに、このクラスで __construct() メソッドを呼び出すことができます。これは完璧です。
class Demo() { private function __construct() { print("I'm a private construct function"); } public static function getInstance() { return new Demo();#这是Demo类内部,可以用new Demo()实例化调用私有的__construct()方法 } } #在类外面,我们就可以这么玩了 Demo::getInstance();
しかし、繰り返しになりますが、最初に __construct をプライベート化し、次に静的メソッドを使用してインスタンスを取得できるように最善を尽くします。これはなに?
実際、このメソッドは、オブジェクトの作成を制御するデザイン パターンでよく使用されます。たとえば、シングルトン パターンでは、グローバルに一意のオブジェクトが 1 つだけ許可されます。
グローバルに一意のオブジェクトを 1 つだけ持つ必要がある場合、上記のコードでは十分ではありません。なぜなら、誰かが getInstance() を 2 回呼び出す限り、2 つが生成されるからです。それでは、上記のコードをもう一度変更してみましょう
class Demo() { private function __construct() { print("I'm a private construct function"); } # 先定义一个空成员装对象 public $_object = null; public static function getInstance() { if(empty(self::$_object)) { # 如果没有创建过,那么就new一个 return new Demo(); } #否则(即以及创建过),我们只要放回已经存在的那个即可 return $_object } }
以上がPHP アクセス制御の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。