>  기사  >  백엔드 개발  >  php: 액세스 제어 및 정적 키워드

php: 액세스 제어 및 정적 키워드

黄舟
黄舟원래의
2017-07-02 10:52:201541검색

1. PHP의 액세스 제어

액세스 제어에는 public, private, protected가 포함됩니다.

액세스 제어(가시성)

속성 또는 메소드에 대한 액세스 제어는 앞에 public, protected(보호됨) 또는 private 키워드를 추가하는 방식입니다. (비공개) 달성합니다. public으로 정의된 클래스 멤버는 어디에서나 액세스할 수 있습니다. protected로 정의된 클래스 멤버는 자체, 하위 클래스 및 상위 클래스에서 액세스할 수 있습니다. private으로 정의된 클래스 멤버는 해당 멤버가 정의된 클래스에서만 액세스할 수 있습니다.

속성의 액세스 제어

클래스 속성은 공개, 보호, 비공개 중 하나로 정의되어야 합니다. var로 정의하면 공개로 간주됩니다.

예제 #1 속성 선언

<?php
/**
 * Define MyClass
 */
class MyClass
{
    public $public = &#39;Public&#39;;
    protected $protected = &#39;Protected&#39;;
    private $private = &#39;Private&#39;;
    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 = &#39;Protected2&#39;;
    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
?>

다른 객체에 대한 접근 제어

동일한 클래스의 객체는 동일한 인스턴스가 아니더라도 서로의 private 및 protected 멤버에 접근할 수 있습니다. 이는 이러한 개체의 내부 구현 세부 정보가 알려져 있기 때문입니다.

예제 #3 동일한 개체 유형의 비공개 멤버에 액세스

<?php
class Test
{
    private $foo;
    public function construct($foo)
    {
        $this->foo = $foo;
    }
    private function bar()
    {
        echo &#39;Accessed the private method.&#39;;
    }
    public function baz(Test $other)
    {
        // We can change the private property:
        $other->foo = &#39;hello&#39;;
        var_dump($other->foo);
        // We can also call the private method:
        $other->bar();
    }
}
$test = new Test(&#39;test&#39;);
$test->baz(new Test(&#39;other&#39;));
?>

위 루틴은 다음을 출력합니다.

string(5) "hello"
Accessed the private method.

3 정적 키워드

정적(정적) 키워드

Tip

이 페이지에서는 정적 키워드를 사용하여 정의하는 방법을 설명합니다. 정적 메서드 및 속성. static은 정적 변수를 정의하고 후기 정적 바인딩에도 사용할 수 있습니다. 정적이 어떻게 사용되는지 보려면 위 페이지를 참조하세요.

클래스 특성이나 메서드를 정적으로 선언하면 클래스를 인스턴스화하지 않고도 직접 액세스할 수 있습니다. 정적 속성은 인스턴스화된 클래스의 개체를 통해 액세스할 수 없습니다(그러나 정적 메서드는 가능함).

PHP 4와의 호환성을 위해 액세스 제어가 지정되지 않은 경우 속성 및 메서드기본값은 공개입니다.

정적 메서드는 객체를 통해 호출할 필요가 없으므로 정적 메서드에서는 의사 변수 $this를 사용할 수 없습니다.

객체는 -> 연산자를 통해 정적 속성에 액세스할 수 없습니다.

정적이 아닌 메서드를 정적으로 호출하면 E_STRICT 수준 오류가 발생합니다.

다른 모든 PHP 정적 변수와 마찬가지로 정적 속성은

표현식이 아닌 리터럴이나 상수로만 초기화할 수 있습니다. 따라서 정적 속성은 정수 또는 배열로 초기화될 수 있지만 다른 변수나 함수 반환 값으로 초기화될 수 없으며 개체를 가리킬 수도 없습니다.

PHP 5.3.0부터 변수를 사용하여 클래스를 동적으로 호출할 수 있습니다. 그러나 이 변수의 값은 키워드 self, parent 또는 static일 수 없습니다.

예제 #1 정적 속성 예

<?php
class Foo
{
    public static $my_static = &#39;foo&#39;;
    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 = &#39;Foo&#39;;
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 = &#39;Foo&#39;;
$classname::aStaticMethod(); // 自 PHP 5.3.0 起
?>

위 내용은 php: 액세스 제어 및 정적 키워드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.