PHP의 ::(이중 콜론)과 ->(화살표)의 차이점은 무엇입니까?
PHP에서 메서드에 액세스하는 방법에는 두 가지가 있는데, 차이점은 무엇입니까?
$response->setParameter('foo', 'bar');
그리고.
sfConfig::set('foo', 'bar');
->
큰 기호나 쉐브론이 는 변수의 로, ( 큰 쉐브론이 있는 )는 변수의 함수로 됩니다.::
은 수업의 됩니다. (이중콜론)
=>
할당 연산자는 어레이 내의 데이터를 할당하는 데만 사용됩니까?은, 「아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.=
변수 인스턴스화 또는 수정에 사용되는 할당 연산자
인스턴스일 , " "를 사용합니다.->
이외의는, 을 사용합니다::
.
, ,,->
멤버에 대한 할 수 되지 않습니다).는 인스턴스 멤버에 대한 접근에 사용됩니다.::
는 보통 스태틱멤버에 액세스하기 위해 사용됩니다(단, 일부 특수한 경우에는 인스턴스 멤버에 액세스하기 위해 사용됩니다).
으로는, 「 」입니다.::
스코프 해결에 사용되며 클래스 이름 중 하나를 가질 수 있습니다.parent
,self
(PHP 5.3의 경우)static
쪽입니니다다parent
의 범위를 상급의 범위를 .self
사용되는 클래스의 범위를 말합니다.static
는 "called scope"(최신 스태틱바인딩 참조)를 나타냅니다.
은 " " " 가 있는 ::
에만 인스턴스 입니다.
- 타깃 메서드가 스태틱으로 선언되지 않았습니다.
- 콜 시 호환되는 오브젝트콘텍스트가 존재하기 때문에 다음 조건이 충족되어야 합니다.
- 은, 「아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아
$this
와 존재하다 - 의 class의
$this
는 호출되는 메서드의 클래스 또는 하위 클래스 중 하나입니다.
- 은, 「아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아
예:
class A {
public function func_instance() {
echo "in ", __METHOD__, "\n";
}
public function callDynamic() {
echo "in ", __METHOD__, "\n";
B::dyn();
}
}
class B extends A {
public static $prop_static = 'B::$prop_static value';
public $prop_instance = 'B::$prop_instance value';
public function func_instance() {
echo "in ", __METHOD__, "\n";
/* this is one exception where :: is required to access an
* instance member.
* The super implementation of func_instance is being
* accessed here */
parent::func_instance();
A::func_instance(); //same as the statement above
}
public static function func_static() {
echo "in ", __METHOD__, "\n";
}
public function __call($name, $arguments) {
echo "in dynamic $name (__call)", "\n";
}
public static function __callStatic($name, $arguments) {
echo "in dynamic $name (__callStatic)", "\n";
}
}
echo 'B::$prop_static: ', B::$prop_static, "\n";
echo 'B::func_static(): ', B::func_static(), "\n";
$a = new A;
$b = new B;
echo '$b->prop_instance: ', $b->prop_instance, "\n";
//not recommended (static method called as instance method):
echo '$b->func_static(): ', $b->func_static(), "\n";
echo '$b->func_instance():', "\n", $b->func_instance(), "\n";
/* This is more tricky
* in the first case, a static call is made because $this is an
* instance of A, so B::dyn() is a method of an incompatible class
*/
echo '$a->dyn():', "\n", $a->callDynamic(), "\n";
/* in this case, an instance call is made because $this is an
* instance of B (despite the fact we are in a method of A), so
* B::dyn() is a method of a compatible class (namely, it's the
* same class as the object's)
*/
echo '$b->dyn():', "\n", $b->callDynamic(), "\n";
출력:
B::$prop_static:B::$prop_static 값B:: func_static(): B:: func_static $b->prop_model:B::$prop_instance 값$b->func_static(): B::func_static $b->func_param(): B:: func_instanceA:: func_instance에서A:: func_instance에서 $a->filength():A:: call Dynamicdynamic dyn(_callStatic)의 경우 $b->flash():A:: call Dynamicdynamic dyn(_call)의 경우
::
는 스태틱 컨텍스트에서 사용됩니다.즉, 일부 메서드 또는 속성이 스태틱으로 선언된 경우:
class Math {
public static function sin($angle) {
return ...;
}
}
$result = Math::sin(123);
,,::
operator(Scope Resolution Operator, a.k.a Paamayim Nekudotayim)는 부모 클래스의 메서드/속성을 호출할 때 다이내믹콘텍스트에서 사용됩니다.
class Rectangle {
protected $x, $y;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
}
class Square extends Rectangle {
public function __construct($x) {
parent::__construct($x, $x);
}
}
->
는 다이내믹 컨텍스트에서 사용됩니다.즉, 일부 클래스의 인스턴스를 처리할 때 다음과 같이 됩니다.
class Hello {
public function say() {
echo 'hello!';
}
}
$h = new Hello();
$h->say();
덧붙여서, OOP 경험이 없을 때는 Symfony를 사용하는 것은 좋지 않다고 생각합니다.
실제로 이 기호에 의해 다른 초기화에 의존하지 않고 정적인 클래스 메서드를 호출할 수 있습니다.
class Test {
public $name;
public function __construct() {
$this->name = 'Mrinmoy Ghoshal';
}
public static function doWrite($name) {
print 'Hello '.$name;
}
public function write() {
print $this->name;
}
}
여기에서는,doWrite()
함수는 다른 메서드 또는 변수에 의존하지 않으며 정적 메서드입니다.그렇기 때문에 이 클래스의 오브젝트를 초기화하지 않고 이 연산자에 의해 이 메서드를 호출할 수 있습니다.
Test::doWrite('Mrinmoy'); // Output: Hello Mrinmoy.
하지만 전화하고 싶다면write
이렇게 하면 초기화에 의존하기 때문에 오류가 발생합니다.
그=>
연산자는 관련 배열에서 키와 값의 쌍을 할당하는 데 사용됩니다.예를 들어 다음과 같습니다.
$fruits = array(
'Apple' => 'Red',
'Banana' => 'Yellow'
);
의미가 비슷해요.foreach
스테이트먼트:
foreach ($fruits as $fruit => $color)
echo "$fruit is $color in color.";
정적 메서드와 인스턴스화된 메서드 및 속성 간의 차이는 PHP 5에서 OOP PHP로 시작하는 사용자에게 가장 큰 장애물 중 하나로 보입니다.
이중 콜론 연산자(히브리어 - trivia에서는 Paamayim Nekudotayim이라고 함)는 정적 컨텍스트에서 객체 또는 속성을 호출할 때 사용됩니다.이는 개체의 인스턴스가 아직 생성되지 않았음을 의미합니다.
화살표 연산자는 반대로 오브젝트 인스턴스의 참조에서 메서드 또는 속성을 호출합니다.
정적 메서드는 삽입된 테이블 ID로 반환 값을 설정한 다음 생성자를 사용하여 행 ID로 개체를 인스턴스화할 수 있으므로 작성 및 삭제 메서드를 위해 데이터베이스에 연결된 개체 모델에서 특히 유용합니다.
네, 처음 부딪혔어요.'PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM'
미안, 내가 잘못했어$instance::method()
했다.$instance->method()
바보 같은 소리.
이상한 점은 이것이 여전히 내 로컬 머신(PHP 5.3.8을 실행 중)에서 정상적으로 작동한다는 것입니다. error_module = E_ALL이라는 경고도 없지만 테스트 서버에서는 구문 오류와 함께 폭발하고 브라우저에 흰색 화면이 표시됩니다.테스트 머신에서 PHP 로깅이 꺼지고 호스팅 회사가 너무 바빠서 켜지 못했기 때문에 그다지 명백하지 않았습니다.
그래서 경고합니다.PHP 설치 중에는 $instance::method()를 사용할 수 있는 것도 있고 사용하지 않는 것도 있습니다.
왜 그런지 자세히 설명해 줄 수 있는 사람이 있다면 그렇게 해 주세요.
언급URL : https://stackoverflow.com/questions/3173501/whats-the-difference-between-double-colon-and-arrow-in-php
'source' 카테고리의 다른 글
Vue js : _이것.$syslog는 함수가 아닙니다. (0) | 2023.01.09 |
---|---|
높은 CPU 소비량 MySQL (0) | 2023.01.09 |
wp_usermeta 테이블의 여러 행에 적격 데이터가 있는 사용자를 선택합니다. (0) | 2022.12.25 |
SQL Provier를 dotnet core 3.1 MySQL(실제로는 MariaDB)에서 작동시키는 방법 (0) | 2022.12.25 |
데이터베이스에서 생성된 열 값을 JPA 및 최대 절전 모드에서 읽기 전용 필드로 정의하는 방법은 무엇입니까? (0) | 2022.12.25 |