底下有更新
!
各位大神好!
關於上一個問題,我覺得與其不停地回覆「我知道問題出在哪了」,感覺有點不太好且有點敷衍。
因此我比較想要努力去成長,等自己有點東西可以解決他人問題時,我覺得這才是我可以給的最好回覆!
所以請恕我不一一回覆了,但大家的建議跟回覆我都有看到!真的很感謝大家!
回歸正題!
目前小弟遇到一個觀念
上的問題,想請大家幫我檢視一下,我這樣理解是否正確
。
謝謝!
對於PHP中的特殊運算符「->」與「::」的差別。
我的理解是:
兩者皆是調用內部的變數或函數,但使用的對象不同。
「->」用於Object
<?php
class test
{
$a = 5;
}
$test = new test
echo($test -> a); //印出 5
?>
「::」用於Class
class Test
{
public static $test = 1;
public static function test(){}
}
此時就可以直接使用,不需要創建Object。
Test :: $test
Test :: test()
請問我這樣有理解錯誤嗎?或是他們還有其他用法,我沒有理解的很精確?
還請各位不令吝嗇指教,謝謝!
先感謝各位大大的回答,小弟十分感激!
「->」與「::」的差別,主要來自於Class的屬性。
簡單說:
::使用在Static屬性的Class
->使用在非Static屬性的Class
另外,This、self、parent的差別
self::與parent:: 使用在Static的Class之中
This 使用在非Static的Class之中
雖然有些地方可以互相使用,但這樣使用是不會出錯的!
目前是這樣理解的!
還有也去了解過Class的屬性,才理解為何有些Class要New有些不用。
總之,謝謝大家的解答!
用比較單純的解釋。我就不說明技術用語了。
「->」為物件導向的使用方式。也就是你說的 Object 。但有一點你倒是有點搞混了。
class 也是 Object 的一種。
所以認真來說,這個符號是class或是Object都是可以用。
「::」這是後期class載入的一種新的應用方式。(說新其實也不算新就是了)
正常來說,其實物件的應用。是需要導入程式與且new應用它才行的。
「::」可以省下new的動作。(當然了,要省下new的動作也是有一些必要條件的就是了)
以上就先簡單說明。其餘的還有靜態及空間的應用方式。這等你後期再去了解就好。
所以簡單說,
「->」可以用於class或是Object。
「::」是比較新的用法。
他可以省下new的動作,直接引用Class裡面的東西
目前這樣理解對嗎?
是的。
不過「::」的使用有一些限定的條件存在。等你碰到了再來查原因吧。
了解!謝謝解答!
class 中::
是「靜態」(static property 或 static method) 使用的->
用在沒有 static 關鍵字的 property 或 method
::
裡面不能用 $this
,因為這個 property 或 method 是共用的。->
可以用 $this
。
大概理解他們的差別了!謝謝!
1. Static 屬性和方法
(1) Class之外:$物件變數->
(限方法)、ClassName::
(屬性和方法)
(2) Class當中:self::
& parent::
(屬性和方法)、$this->
(限方法)
2. 非Static 屬性和方法 (實例物件)
(1) Class之外:$物件變數->
(屬性和方法)
(2) Class當中:self::
& parent::
(限方法)、$this->
(屬性和方法)
https://www.php.net/manual/zh/language.oop5.paamayim-nekudotayim.php
:: 用在靜態類別調用、或是類別內部調用,或是父階類別調用
-> 要new的類別在用的符號
https://www.tehplayground.com/PPIcUX6xF06tVR8I
示意程式碼方便理解觀念 ($this、->、parent、self、::):
<?php
class MyClass {
const CONST_VALUE = 'A constant value';
public static $myStatic = 'myStaticVar';
public $myVar = 'parent myVar';
public static function staticFn () {
echo 'staticFn echo "' . self::$myStatic . '"' . "\n";
}
public static function staticFn2 () {
echo 'staticFn2 call ';
self::staticFn();
}
public function objectEchoPropFn () {
echo "parent objectEchoPropFn echo \"$this->myVar\" \n" ;
}
public function objectEchoStaticVarFn () {
echo 'objectEchoStaticVarFn echo ' . '"' . self::$myStatic . '"' . "\n";
}
public function objectCallStaticFn () {
echo 'objectCallStaticFn call ';
// $this->staticFn();
self::staticFn();
}
}
class ExtendsClass extends MyClass {
public $myVar = 'child myVar';
public $myChildVar = 'myChildVar';
public static function staticFn3 () {
echo 'staticFn3 echo parent static const: ' . '"' . parent::CONST_VALUE . '"';
}
public function objectEchoPropFn () {
echo 'child objectEchoPropFn call parent method: ' ;
parent::objectEchoPropFn();
}
public function objectEchoChildPropFn () {
echo 'objectEchoChildPropFn echo' . '"' . $this->myChildVar . '"' . "\n";
}
}
echo "::用法 \n";
echo '"' . MyClass::CONST_VALUE . '"' . "\n";
echo '"' . MyClass::$myStatic . '"' . "\n";
MyClass::staticFn();
MyClass::staticFn2();
ExtendsClass::staticFn3();
echo "\n\n->用法 \n";
$objMyClass = new MyClass();
$objExtendsClass = new ExtendsClass();
echo '"' . $objMyClass->myVar . '"' . "\n";
$objMyClass->objectEchoPropFn();
$objMyClass->objectEchoStaticVarFn();
$objMyClass->objectCallStaticFn();
echo "\n";
echo '"' . $objExtendsClass->myVar . '"' . "\n";
$objExtendsClass->objectEchoPropFn();
$objExtendsClass->objectEchoChildPropFn();
echo "\n";
$objMyClass->staticFn();
$objExtendsClass->staticFn2();
輸出:
::用法
"A constant value"
"myStaticVar"
staticFn echo "myStaticVar"
staticFn2 call staticFn echo "myStaticVar"
staticFn3 echo parent static const: "A constant value"
->用法
"parent myVar"
parent objectEchoPropFn echo "parent myVar"
objectEchoStaticVarFn echo "myStaticVar"
objectCallStaticFn call staticFn echo "myStaticVar"
"child myVar"
child objectEchoPropFn call parent method: parent objectEchoPropFn echo "child myVar"
objectEchoChildPropFn echo "myChildVar"
staticFn echo "myStaticVar"
staticFn2 call staticFn echo "myStaticVar"
以上有很多前輩回覆了我就不多說。
來分享我自己的學習方式。
GOOGLE上有很多前人分享的知識可以參考,很方便的,
看一遍不懂就多看幾遍,多看幾篇文章,範例很多。
這是我搜尋過後找出的幾篇文章給你參考 :
這是我下的關鍵字 : php 物件導向 "::"符號 意思
給你參考
你問的問題是物件導向的基礎,建議還是從物件導向基礎學起,不然之後看到很多物件導向的關鍵字,你都會卡住