2010-05-10 12 views
14

मैं हमेशा गंभीर परियोजनाओं में लोगों को :: हर जगह, और -> कभी-कभी स्थानीय वातावरण में देखता हूं।PHP और 0-30> के बीच अंतर

मैं केवल -> स्वयं का उपयोग करता हूं और कभी भी ऐसी स्थिति में समाप्त नहीं होता जब मुझे कक्षा के बाहर स्थिर मूल्य की आवश्यकता होती है। क्या मैं एक बुरे व्यक्ति हूँ?

मैं समझता हूँ के रूप में, केवल स्थिति जब -> काम नहीं करेगा तब होता है जब मैं निम्न प्रयास करें:

class StaticDemo { 
    private static $static 
} 

$staticDemo = new StaticDemo(); 

$staticDemo->static; // wrong 
$staticDemo::static; // right 

लेकिन मैं कुछ प्रोग्रामिंग शुद्धता जब मैं :: द्वारा सरल सार्वजनिक तरीकों कॉल नहीं करते पर बाहर याद आ रही है ?

या यह सिर्फ इतना है कि मैं एक उदाहरण बनाये बिना एक विधि को कॉल कर सकता हूं?

+14

"क्या मैं एक बुरे व्यक्ति हूं?" एलओएल –

+2

आप एक बुरे व्यक्ति हैं, क्योंकि आपने गरीब वर्ग को तुरंत अपने स्थिर क्षेत्र को कॉल करने के लिए तत्काल किया है। – doc

+0

PHP के MySQLi ओओपी में "->" और "::" के बीच अंतर का संभावित डुप्लिकेट (http://stackoverflow.com/questions/1245121/difference-between-and-in-php-mysqli-oop) – Sarfraz

उत्तर

7

:: स्थिर गुणों या कक्षा के तरीकों के संदर्भ में है। -> उदाहरण गुणों और विधियों के संदर्भ के लिए है। आप किसी प्रोग्रामिंग शुद्धता पर अनुपलब्ध नहीं हैं, और यदि आप एक बुरे व्यक्ति हैं तो यह इसके कारण नहीं है। आप जो भी उपयोग करते हैं वह आपकी कक्षा के उद्देश्य और इसके लिखित पर निर्भर करता है। लेकिन, PHP के पास हाल ही में नामस्थान नहीं थे जब तक कि बहुत से लोगों ने टकराव नामांकन से बचने के लिए नामस्थानों का अनुकरण करने के लिए स्थैतिक कक्षाओं में अपना कोड encapsulated। यह संभव है कि आप कोड देख रहे हों जो ऐसा करता है।

12

जब आप एक वर्ग

class StaticDemo {...}; 
StaticDemo::static 

अगर आप का दृष्टांत है उपयोग का दृष्टांत नहीं है, डबल पेट प्रयोग किया जाता है ->

class StaticDemo {...}; 
$s = new StaticDemo(); 
$s->static; 

यह http://php.net/manual/en/language.oop5.patterns.php

+13

आपने अभी तक जवाब नहीं दिया है कि वह एक बुरे व्यक्ति है या नहीं। मैं व्यक्तिगत रूप से मानता हूं कि यह प्राथमिक प्रश्न है। आपने केवल माध्यमिक प्रश्नों का उत्तर दिया है। : पी –

+3

कोई बुरे व्यक्ति नहीं, कम से कम उतना बुरा नहीं जितना कि मुझे स्पष्टीकरण के बिना मुझे वोट दिया गया। मैं कैसे सुधार कर सकता हूं? –

2

में आगे बताया गया है हां, आप एक विधि बनाये बिना एक विधि या मूल्य का उपयोग कर सकते हैं।

यह उपयोगी होगा, उदाहरण के लिए, यदि आपके पास कोई मान है कि कक्षा के सभी उदाहरण उपयोग करते हैं। हालांकि, इस मान को कहें, आपके ऐप की शुरुआत में आरंभ करने की आवश्यकता है। आप इसे शुरू करने के लिए StaticDemo::static = 42; जैसे कुछ का उपयोग कर सकते हैं, और फिर आपकी कक्षा के सभी उदाहरण इसे एक्सेस करने में सक्षम होंगे।

1

:: स्थिर विधियों के लिए उपयोग किया जाता है, यदि आपके पास कोई ऑब्जेक्ट उदाहरण नहीं है तो आप कॉल करते हैं।

3

-> एक instanciated कक्षा के लिए है। :: एक स्थिर कॉल है।

:: विरासत रचनाकारों (एक बच्चे को मूल निर्माता का उपयोग करने वाले बच्चे) में उपयोग किया जाता है और जब किसी अन्य विधि के भीतर एक स्थिर विधि का जिक्र किया जाता है।

मैं नहीं कहूंगा कि स्थैतिक कॉल का उपयोग न करने से आप एक बुरे व्यक्ति बन जाते हैं!

1

स्थिर तरीके और गुण कक्षा के किसी विशेष तत्काल से स्वतंत्र हैं। इन्हें डबल कॉलन (: :) का उपयोग करके एक्सेस किया जाना चाहिए। ->

का उपयोग करके गैर स्थैतिक विधियों और गुणों का उपयोग किया जाना चाहिए, यह आपको कुछ सुंदर चीजों को करने की अनुमति देता है। "->" जब वस्तु संदर्भ और में जब वर्ग सीधे तक पहुँचने "::"

class foo { 
    public static $i = 0; 

    public function __construct() { 
    self::$i++; 
    } 
} 

$a = new foo(); 
$b = new foo(); 
echo foo::$i; 
// outputs 2 
1

उपयोग: एक तुच्छ उदाहरण के लिए एक काउंटर है कि रहता है कक्षा के उदाहरण की संख्या का ट्रैक मौजूद है। अपने उदाहरण में हो सकता है कि:

class StaticDemo { 
    public static $staticVar = 'blabla'; 
    public $normalVar = 'foobar'; 
} 

$foo = new StaticDemo(); 
echo $foo->normalVar; //object context, echoes "foobar" 
echo StaticDemo::staticVar; //class or "static" context, echoes "blabla" 

पढ़ें विस्तृत इंटेल के लिए this

1

या यह सिर्फ इतना है कि मैं एक उदाहरण बनाये बिना एक विधि को कॉल कर सकता हूं?

सही।

स्थिर तरीकों/सदस्यों को कॉल करते समय :: (स्कोप रिज़ॉल्यूशन ऑपरेटर) का उपयोग किया जाता है। ऐसा करने के लिए आपको एक उदाहरण बनाने की आवश्यकता नहीं है (जैसे आपने अपने उदाहरण में किया था)।

सही संदर्भ में -> और :: का उपयोग ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग शुद्धता की कुंजी है। जब आप पूरी तरह से कक्षा में आवेदन करते हैं, न केवल कक्षा के एक विशिष्ट उदाहरण (वस्तु) के लिए, आपको केवल स्थिर चर/विधियां बनाना चाहिए।

0

ठीक है आप -> और :: का उपयोग करने के तरीके के बारे में सही हैं। लेकिन कभी-कभी यह वर्ग की वस्तुओं को बनाने के लिए भावना नहीं बनाता है। यहाँ एक उदाहरण

class Settings 
{ 
    public static $setting1; 
    public static $setting2; 
    ... // lots of other vars and functions 
} 
if(Setting::$setting1) 
    //do something 

तुलना बनाम

class Settings 
{ 
    public $setting1; 
    public $setting2; 
    ... // lots of other vars and functions 
} 
$set = new Settings() 
if($set->setting1) 
    //do something 

जैसा कि मैंने कहा यह रूप में वहाँ हमेशा केवल एक आवश्यक उदाहरणों बनाने के लिए नहीं मेकअप भावना करता है। इस मामले में स्थैतिक बेहतर फिट बैठता है। यह वेब में निकलता है जब हम वास्तविक ऑब्जेक्ट्स उदा। उपयोगकर्ता आदि इसलिए पूर्व

4

का प्रसार आपने E_STRICT मोड में सख्त मानक चेतावनी का कारण बना दिया। आप एक बुरे व्यक्ति हैं।

<?php 

error_reporting(E_ALL | E_STRICT); 

header('Content-type: text/plain'); 

class Foo { 
    public $msg = "Hello, public.\n"; 
    public static $msgStatic = "Hello, static.\n"; 

    public function write() { 
     echo "Hello, write.\n"; 
    } 

    public static function writeStatic() { 
     echo "Hello, writeStatic.\n"; 
    } 
} 

//echo Foo::$msg; // Fatal error: Access to undeclared static property: Foo::$msg 
echo Foo::$msgStatic; 
echo Foo::write(); // Strict Standards: Non-static method Foo::write() should not be called statically 
echo Foo::writeStatic(); 

echo "------------------------\n"; 

$f = new Foo; 
echo $f->msg; 
echo $f->msgStatic; // Strict Standards: Accessing static property Foo::$msgStatic as non static 
        // Notice: Undefined property: Foo::$msgStatic 
echo $f->write(); 
echo $f->writeStatic(); 

आउटपुट:

Hello, static. 

Strict Standards: Non-static method Foo::write() should not be called statically in /home/adam/public_html/2010/05/10/bad.php on line 22 
Hello, write. 
Hello, writeStatic. 
------------------------ 
Hello, public. 

Strict Standards: Accessing static property Foo::$msgStatic as non static in /home/adam/public_html/2010/05/10/bad.php on line 29 

Notice: Undefined property: Foo::$msgStatic in /home/adam/public_html/2010/05/10/bad.php on line 29 
Hello, write. 
Hello, writeStatic. 
1

के रूप में अन्य लोगों ने कहा,

  • :: 'डबल पेट' एक स्थिर संपत्ति या विधि संदर्भित करने के लिए है।
  • -> 'डैश तीर' किसी वर्ग या क्लास इंस्टेंस के तरीके को संदर्भित करने के लिए है।

लेकिन यह भी ध्यान देने योग्य बात है कि

  • :: अक्सर एक संपत्ति या विधि कि एक निश्चित वर्ग के अंतर्गत आता है (चाहे वह स्थिर या उदाहरण है) का उल्लेख करने के आशुलिपि के रूप में ग्रंथों में प्रयोग किया जाता है इसके लायक।

'नोट ... दस्तावेज़ीकरण में देखें ...': http://books.google.co.uk/books?id=qVLjFk_4zVYC&lpg=PA66&dq=php%205%20objects&pg=PA46#v=onepage&q=php%205%20objects&f=false

2

मैं यह समझ के रूप में स्थिर एक ही प्रकार की वस्तुओं के बीच साझा किया जाता है:

class test{ 
    static function print_test(){ 
     print "hello!"; 
    } 
} 
$objectA = new test(); 
$objectB = new test(); 

समारोह print_test दो वस्तुओं के बीच "साझा" कर दिया जाएगा। लेकिन पकड़ फंक्शन print_test() कक्षा के अंदर संदर्भ कुछ नहीं होना चाहिए! यहां तक ​​कि आप PHP 5 स्वीकार करता है।

चूंकि फ़ंक्शन print_test उदाहरण में सिर्फ "हैलो!" प्रिंट करता है और कक्षा के अंदर कुछ भी संदर्भ नहीं देता है क्यों इसके लिए स्मृति ऑब्जेक्ट में आवंटित करें और $ objectB? बस एक स्थिर फ़ंक्शन और $ ऑब्जेक्ट ए और $ ऑब्जेक्टबी को स्वचालित रूप से इंगित करना चाहिए।

वैसे यह अन्य भाषाओं में इसके पीछे सिद्धांत है, लेकिन चूंकि php5 आपको एक स्थिर फ़ंक्शन में $ संदर्भित करने की अनुमति देता है, इसलिए मुझे विश्वास नहीं है कि यह एक वास्तविक स्थिर कार्य है क्योंकि इसे किसी भी गुण प्राप्त करने के लिए गतिशील होना होगा ($ यह-> परिवर्तनीय) वह अद्वितीय वस्तु।

संबंधित मुद्दे