iT邦幫忙

0

PHP中 ->與:: 的差別

  • 分享至 

  • xImage

底下有更新

各位大神好!
關於上一個問題,我覺得與其不停地回覆「我知道問題出在哪了」,感覺有點不太好且有點敷衍。
因此我比較想要努力去成長,等自己有點東西可以解決他人問題時,我覺得這才是我可以給的最好回覆!
所以請恕我不一一回覆了,但大家的建議跟回覆我都有看到!真的很感謝大家!


回歸正題!

目前小弟遇到一個觀念上的問題,想請大家幫我檢視一下,我這樣理解是否正確
謝謝!

對於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有些不用。
總之,謝謝大家的解答!

一個class中可以設定方法、屬性、靜態方法、靜態屬性。
實體化的類別就可以調用其內部的屬性和方法。
非實體化的類別可以調用其內部的靜態屬性和靜態方法
靜態屬性可以做為唯一實例化的存在(單例模式)
而不管是靜態中操作物件。
或是物件中操作靜態都是物件導向的技巧。
player iT邦大師 1 級 ‧ 2020-11-16 23:52:59 檢舉
PHP 的 -> 與 :: 的用法應該與C++時的用法一樣吧
-> 是用在 new 出來的物件的成員
:: 是用在該class的靜態成員
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
6
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2020-11-16 10:48:18
最佳解答

用比較單純的解釋。我就不說明技術用語了。

「->」為物件導向的使用方式。也就是你說的 Object 。但有一點你倒是有點搞混了。
class 也是 Object 的一種。
所以認真來說,這個符號是class或是Object都是可以用。

「::」這是後期class載入的一種新的應用方式。(說新其實也不算新就是了)
正常來說,其實物件的應用。是需要導入程式與且new應用它才行的。
「::」可以省下new的動作。(當然了,要省下new的動作也是有一些必要條件的就是了)

以上就先簡單說明。其餘的還有靜態及空間的應用方式。這等你後期再去了解就好。

看更多先前的回應...收起先前的回應...

所以簡單說,
「->」可以用於class或是Object。
「::」是比較新的用法。
他可以省下new的動作,直接引用Class裡面的東西

目前這樣理解對嗎?

是的。
不過「::」的使用有一些限定的條件存在。等你碰到了再來查原因吧。

了解!謝謝解答!

淺水員 iT邦大師 6 級 ‧ 2020-11-16 11:30:22 檢舉

class 中
:: 是「靜態」(static property 或 static method) 使用的
-> 用在沒有 static 關鍵字的 property 或 method

:: 裡面不能用 $this,因為這個 property 或 method 是共用的。
-> 可以用 $this

大概理解他們的差別了!謝謝!

通靈亡 iT邦高手 1 級 ‧ 2020-11-16 15:21:04 檢舉

1. Static 屬性和方法
(1) Class之外:$物件變數->(限方法)、ClassName:: (屬性和方法)
(2) Class當中:self:: & parent:: (屬性和方法)、$this-> (限方法)

2. 非Static 屬性和方法 (實例物件)
(1) Class之外:$物件變數-> (屬性和方法)
(2) Class當中:self:: & parent:: (限方法)、$this-> (屬性和方法)

1
japhenchen
iT邦超人 1 級 ‧ 2020-11-16 11:09:45

https://www.php.net/manual/zh/language.oop5.paamayim-nekudotayim.php
:: 用在靜態類別調用、或是類別內部調用,或是父階類別調用

-> 要new的類別在用的符號

原來Object還有要new跟不要new的喔?@@
謝謝提供研究方向!

靜態類別........載入時就已經建立好且不會變動的類別,像是系統字串類,時間日期類......

查了一下大概理解了!謝謝!

1
通靈亡
iT邦高手 1 級 ‧ 2020-11-16 11:50:42

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"

謝謝謝謝謝謝!!!!!!
這個例子讓我釐清好多東西!!!

0
Wen.
iT邦新手 5 級 ‧ 2020-11-17 14:04:54

以上有很多前輩回覆了我就不多說。

來分享我自己的學習方式。
GOOGLE上有很多前人分享的知識可以參考,很方便的,
看一遍不懂就多看幾遍,多看幾篇文章,範例很多。

這是我搜尋過後找出的幾篇文章給你參考 :

  1. 學習筆記

  2. PHP 自學筆記 (3)

這是我下的關鍵字 : php 物件導向 "::"符號 意思
給你參考

你問的問題是物件導向的基礎,建議還是從物件導向基礎學起,不然之後看到很多物件導向的關鍵字,你都會卡住

謝謝!
我當初下的關鍵字是「-> :: PHP」
基本上大概知道::的用法,但不懂兩者的差異
現在才知道是「靜態」這個屬性的關係

物件導向我會再繼續研究的,謝謝你提供的資料!

我要發表回答

立即登入回答