PHP 5에서 using const
과 static
? 의 차이점은 무엇 입니까?
언제 각각 적절한가요? 그리고 어떤 역할을하는 수행 public
, protected
그리고 private
놀이 – 어떤 경우에?
답변
클래스의 맥락에서 정적 변수는 객체가 아닌 클래스 범위에 있지만 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을 통해 정의 클래스에서만 액세스 할 수 있습니다.
답변
마지막으로해야 할 점은 const가 항상 정적이고 공개적이라는 것입니다. 즉, 클래스 내에서 다음과 같이 const에 액세스 할 수 있습니다.
class MyClass
{
const MYCONST = true;
public function test()
{
echo self::MYCONST;
}
}
수업 밖에서 다음과 같이 액세스하십시오.
echo MyClass::MYCONST;
답변
상수 는 상수 일뿐입니다. 선언 한 후에는 값을 변경할 수 없습니다.
정적 변수는 클래스의 인스턴스를 만들지 않고도 액세스 할 수 있으므로 클래스의 모든 인스턴스간에 공유됩니다.
또한 함수에 정적 로컬 변수 가있을 수 있습니다 ( 함수의 첫 번째 실행시) 한 번만 선언되고 함수 호출간에 해당 값을 저장할 수 있습니다. 예 :
function foo()
{
static $numOfCalls = 0;
$numOfCalls++;
print("this function has been executed " . $numOfCalls . " times");
}
답변
클래스 상속에 대해 이야기 할 때 self
및 static
키워드 를 사용하여 다른 범위의 상수 또는 변수를 구별 할 수 있습니다 . 다음에 액세스하는 방법을 보여주는이 예를 확인하십시오.
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에서 정적 바인딩에 대한 자세한 내용 은 여기를 참조하십시오 .
또한 여기 및 여기 에서 다른 질문에 대한 답변을 확인 하십시오 .
답변
클래스 메서드 나 속성을 정적으로 선언하면 클래스를 인스턴스화하지 않고도 액세스 할 수 있습니다.
클래스 상수는 일반 상수와 같으며 런타임에 변경할 수 없습니다. 이것은 또한 const를 사용할 유일한 이유이기도합니다.
개인, 공용 및 보호는 누가 어떤 매개 변수 / 방법에 액세스 할 수 있는지를 설명하는 액세스 수정 자입니다.
공용은 다른 모든 개체에 액세스 할 수 있음을 의미합니다. 비공개는 인스턴스화 된 클래스 만 액세스 할 수 있음을 의미합니다. 보호는 인스턴스화 된 클래스 및 파생 클래스에 액세스 할 수 있음을 의미합니다.
답변
정적 멤버, 상수 변수 및 액세스 수정 자 (비공개, 공개 및 보호)에 대해 지금까지 배운 것들이 있습니다.
일정한
정의
이름처럼 상수 변수의 값은 변경할 수 없습니다. 상수는 $ 기호를 사용하여 선언하거나 사용하지 않는다는 점에서 일반 변수와 다릅니다.
값은 변수, 속성, 수학 연산 결과 또는 함수 호출이 아닌 상수 식이어야합니다.
참고 : 변수 값은 키워드 일 수 없습니다 (예 : 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 액세스 수정 자)
아래 정의를 읽기 전에 캡슐화에 대한이 기사를 읽으십시오. 개념을보다 깊이 이해하는 데 도움이됩니다.
정의
비공개, 공개 및 보호 된 키워드를 사용하여 클래스의 멤버에 대한 액세스를 제어 할 수 있습니다. 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
나는 당신이 개념을 이해하기를 바랍니다. 읽어 주셔서 감사합니다 🙂 🙂 좋은 것을 가지고
답변
@Matt 위대한 대답을 요약하면 다음과 같습니다.
-
필요한 속성을 변경해서는 안되는 경우 상수가 올바른 선택입니다.
-
필요한 속성을 변경할 수 있으면 static을 대신 사용하십시오.
예:
class User{
private static $PASSWORD_SALT = "ASD!@~#asd1";
...
}
class Product{
const INTEREST = 0.10;
...
}