PHP 5 : const 대 정적


답변:


187

클래스의 맥락에서 정적 변수는 객체가 아닌 클래스 범위에 있지만 const와 달리 값을 변경할 수 있습니다.

class ClassName {
    static $my_var = 10;  /* defaults to public unless otherwise specified */
    const MY_CONST = 5;
}
echo ClassName::$my_var;   // returns 10
echo ClassName::MY_CONST;  // returns 5
ClassName::$my_var = 20;   // now equals 20
ClassName::MY_CONST = 20;  // error! won't work.

공개, 보호 및 개인은 const (항상 공개)의 측면에서 관련이 없습니다. 정적 변수를 포함하여 클래스 변수에만 유용합니다.

  • 공용 정적 변수는 ClassName :: $ variable을 통해 어디서나 액세스 할 수 있습니다.
  • 보호 된 정적 변수는 클래스를 정의하거나 ClassName :: $ variable을 통해 클래스를 확장하여 액세스 할 수 있습니다.
  • 전용 정적 변수는 ClassName :: $ variable을 통해 정의 클래스에서만 액세스 할 수 있습니다.

편집 : PHP 7.1.0은 클래스 상수의 가시성을 지정하는 지원을 도입했습니다 .


27
내가 사용하는 것을 선호 self::$variable내가 클래스 이름이 매우 클래스의 시작 부분에있는 한 번만 자체 내에서 언급 유지하는 것을 선호하기 때문에 보호 정적 및 개인 정적 변수.
Lukman

3
네, 좋은 지적입니다. 클래스 자체에서 참조하는 경우 self 키워드를 사용할 수 있다고 언급하지 않았습니다. 위에서 제공 한 예제는 클래스 정의 외부에서 수행되었으므로 클래스 이름을 사용해야합니다.
Matt Huggins

훌륭한 답변, 수락에 매우 가까움. "공개, 보호 및 개인은 const와 관련이 없습니다"라는 한 가지 점을 분명히 설명해 주시겠습니까?-왜? const는 기본적으로 모두 공개입니까? 모든 개인?
Chris Jacob

1
정적 변수가 필요하지 $않습니까? static $my_var = 10;정의에서
Daniel W.

올드 스레드,하지만 난 뭔가를 추가하고 싶습니다 : 체크 아웃 php.net/manual/en/... 설명, static변수는 매우 싱글과 재귀 함수에 유용도됩니다. 값을 변경할 수는 있지만 변수는 한 번만 초기화됩니다. 싱글 톤 생성 방법에 대한 자세한 내용은 stackoverflow.com/questions/203336/… 을 참조하십시오 . 저에게는 정적 변수를 선호하는 상황이 있습니다.
Erik van de Ven

20

마지막으로해야 할 점은 const가 항상 정적이고 공개적이라는 것입니다. 즉, 클래스 내에서 다음과 같이 const에 액세스 할 수 있습니다.

class MyClass
{
     const MYCONST = true;
     public function test()
     {
          echo self::MYCONST;
     }
}

수업 밖에서 다음과 같이 액세스하십시오.

echo MyClass::MYCONST;

1
그 선언이 사실입니까? "const는 항상 정적이고 공개적"입니까?
apil.tamang

7
이것은 더 이상 사실이 아닙니다. PHP 7.1부터 상수는 private 또는 protected로 선언 될 수 있습니다. 참조 RFC
DisgruntledGoat

11

상수상수 일뿐입니다. 선언 한 후에는 값을 변경할 수 없습니다.

정적 변수는 클래스의 인스턴스를 만들지 않고도 액세스 할 수 있으므로 클래스의 모든 인스턴스간에 공유됩니다.

또한 함수에 정적 로컬 변수 가있을 수 있습니다 ( 함수의 첫 번째 실행시) 한 번만 선언되고 함수 호출간에 해당 값을 저장할 수 있습니다. 예 :

function foo()
{
   static $numOfCalls = 0;
   $numOfCalls++;
   print("this function has been executed " . $numOfCalls . " times");
}

7

클래스 상속에 대해 이야기 할 때 selfstatic키워드 를 사용하여 다른 범위의 상수 또는 변수를 구별 할 수 있습니다 . 다음에 액세스하는 방법을 보여주는이 예를 확인하십시오.

class Person
{
    static $type = 'person';

    const TYPE = 'person';

    static public function getType(){
        var_dump(self::TYPE);
        var_dump(static::TYPE);

        var_dump(self::$type);
        var_dump(static::$type);
    }
}

class Pirate extends Person
{
    static $type = 'pirate';

    const TYPE = 'pirate';
}

그리고 나서 :

$pirate = new Pirate();
$pirate::getType();

또는:

Pirate::getType();

산출:

string(6) "person" 
string(6) "pirate" 
string(6) "person" 
string(6) "pirate"

self::, 정적 속성과 상수를 호출하는 동일한 범위 (이 경우 Person수퍼 클래스)에서 static::상수를 나타내며 런타임에 범위에서 속성과 상수에 액세스합니다 (이 경우Pirate 하위 클래스) .

php.net에서 정적 바인딩에 대한 자세한 내용 은 여기를 참조하십시오 .
또한 여기여기 에서 다른 질문에 대한 답변을 확인 하십시오 .


4

클래스 메서드 나 속성을 정적으로 선언하면 클래스를 인스턴스화하지 않고도 액세스 할 수 있습니다.

클래스 상수는 일반 상수와 같으며 런타임에 변경할 수 없습니다. 이것은 또한 const를 사용할 유일한 이유이기도합니다.

개인, 공용 및 보호는 누가 어떤 매개 변수 / 방법에 액세스 할 수 있는지를 설명하는 액세스 수정 자입니다.

공용은 다른 모든 개체에 액세스 할 수 있음을 의미합니다. 비공개는 인스턴스화 된 클래스 만 액세스 할 수 있음을 의미합니다. 보호는 인스턴스화 된 클래스 및 파생 클래스에 액세스 할 수 있음을 의미합니다.


2

정적 멤버, 상수 변수 및 액세스 수정 자 (비공개, 공개 및 보호)에 대해 지금까지 배운 것들이 있습니다. 일정한

정의

이름처럼 상수 변수의 값은 변경할 수 없습니다. 상수는 $ 기호를 사용하여 선언하거나 사용하지 않는다는 점에서 일반 변수와 다릅니다.

값은 변수, 속성, 수학 연산 결과 또는 함수 호출이 아닌 상수 식이어야합니다.

참고 : 변수 값은 키워드 일 수 없습니다 (예 : self, parent 및 static).

PHP에서 상수 선언

<?php
class constantExample{

   const CONSTANT = 'constant value'; //constant

 }
?>

Constant의 범위는 전역 적이며 자체 키워드를 사용하여 액세스 할 수 있습니다

<?php
class MyClass
{
    const CONSTANT = 'constant value';

    function showConstant() {
        echo  self::CONSTANT . "\n";
    }
}

echo MyClass::CONSTANT . "\n";

$classname = "MyClass";
echo $classname::CONSTANT . "\n"; // As of PHP 5.3.0

$class = new MyClass();
$class->showConstant();

echo $class::CONSTANT."\n"; // As of PHP 5.3.0

?>

공전

정의

정적 키워드는 클래스, 멤버 함수 또는 변수를 선언하는 데 사용할 수 있습니다. 클래스의 정적 멤버는 전역 키워드를 사용하여 액세스 할 수 있습니다. . static으로 선언 된 속성은 인스턴스화 된 클래스 객체로는 액세스 할 수 없습니다 (정적 메서드는 가능). 가시성 선언 (public, private, protected)을 사용하지 않으면 속성 또는 메서드는 마치 public으로 선언 된 것처럼 처리됩니다. 정적 메서드는 개체의 인스턴스없이 호출 할 수 있기 때문입니다.

참고 : 의사 변수 $ this는 static으로 선언 된 메소드에서 사용할 수 없습니다. 화살표 속성을 사용하여 객체를 통해 정적 속성에 액세스 할 수 없습니다->

PHP 5.3.0부터는 변수를 사용하여 클래스를 참조 할 수 있습니다. > variable의 값은 키워드 일 수 없습니다 (예 : self, parent 및 static).

정적 속성 예

<?php
class Foo
{
    public static $my_static = 'foo'; //static variable 

    public static function staticValue() { //static function example
        return self::$my_static;  //return the static variable declared globally
    }
}

?>

정적 속성 및 함수 액세스 예

 <?php
     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";

 ?>

공개, 개인, 보호 (AKA 액세스 수정 자)

아래 정의를 읽기 전에 캡슐화에 대한이 기사를 읽으십시오. 개념을보다 깊이 이해하는 데 도움이됩니다.

링크 1 위키 백과

캡슐화에 대한 자습서 포인트 링크

정의

비공개, 공개 및 보호 된 키워드를 사용하여 클래스의 멤버에 대한 액세스를 제어 할 수 있습니다. public으로 선언 된 반원은 어디에서나 액세스 할 수 있습니다. protected로 선언 된 멤버는 클래스 자체 내에서 상속 된 부모 클래스로만 액세스 할 수 있습니다. private으로 선언 된 멤버는 멤버를 정의하는 클래스에서만 액세스 할 수 있습니다.

 <?php 
class Example{
 public $variable = 'value'; // variable declared as public 
 protected $variable = 'value' //variable declared as protected
 private $variable = 'value'  //variable declared as private

 public function functionName() {  //public function
 //statements
 }

 protected function functionName() {  //protected function
 //statements
 }
  private function functionName() {  //private function
   //statements
   }

} 
 ?> 

공개, 개인 및 보호 회원 액세스 예

공용 변수는 클래스 외부 또는 클래스 내부에서 액세스하고 수정할 수 있습니다. 그러나 클래스 내부에서만 개인 및 보호 변수 및 함수에 액세스 할 수 있습니다. 클래스 외부의 보호 또는 공용 멤버의 값은 수정할 수 없습니다.

  <?php 
  class Example{
    public $pbVariable = 'value'; 
    protected $protVariable = 'value'; 
    private $privVariable = 'value';
    public function publicFun(){

     echo $this->$pbVariable;  //public variable 
     echo $this->$protVariable;  //protected variable
     echo $this->privVariable; //private variable
    }

   private function PrivateFun(){

 //some statements
  }
  protected function ProtectedFun(){

 //some statements
  }

  }


 $inst = new Example();
 $inst->pbVariable = 'AnotherVariable'; //public variable modifed from outside
 echo $inst->pbVariable;   //print the value of the public variable

 $inst->protVariable = 'var'; //you can't do this with protected variable
 echo $inst->privVariable; // This statement won't work , because variable is limited to private

 $inst->publicFun(); // this will print the values inside the function, Because the function is declared as a public function

 $inst->PrivateFun();   //this one won't work (private)
 $inst->ProtectedFun();  //this one won't work as well (protected)

  ?>

자세한 내용은 가시성 Vipibility Php Doc 에 대한이 PHP 설명서를 읽으십시오

참조 : php.net

나는 당신이 개념을 이해하기를 바랍니다. 읽어 주셔서 감사합니다 :) :) 좋은 것을 가지고


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.