2016-09-22 10 views
7

मेरे पास एक महत्वपूर्ण-मूल्य डेटाबेस तालिका है, जहां मैं कुछ सेटिंग्स संग्रहीत करता हूं।PHP की निरंतर वस्तु क्यों नहीं हो सकती है?

मैं इन सेटिंग्स को PHP स्थिर ऑब्जेक्ट में रखना चाहता हूं, क्योंकि उन्हें संपादन योग्य नहीं होना चाहिए।

PHP7 में हम अब यह कर सकते हैं:

define('MySettings', array(
    'title' => 'My title' 
    // etc 
)); 

// And call it with 
echo MySettings['title']; 

और यह महान काम करता है।

लेकिन कारण है कि मैं ऐसा नहीं कर सकते:

define('MySettings', (object) array('title' => 'My title')); 

तो मैं इसे इस के बजाय की तरह कह सकते हैं:

echo MySettings->title; 
// or 
echo MySettings::title; 

यह केवल क्योंकि मुझे लगता है कि यह एक के रूप में यह टाइप करने के लिए जल्दी और खूबसूरत है ऑब्जेक्ट प्रॉपर्टी/स्थिर ($obj->key, $obj::key), सरणी ($array['key'])

क्या कोई कारण यह संभव नहीं है?

+7

क्योंकि तकनीकी रूप से वस्तुओं को स्थिर नहीं किया जा सकता है। उनमें कोड हो सकता है, जिसका अर्थ है कि वस्तु के आंतरिक को बदला जा सकता है, जिसका अर्थ है कि वे स्थिर नहीं हैं।यही कारण है कि आपके पास स्थिरांक है - यह एक वादा/गारंटी है कि आप जो भी स्थिर रखते हैं वह कभी भी नहीं बदलेगा। –

+1

वर्तमान में PHP के भविष्य के संस्करण के लिए अपरिवर्तनीय वस्तुओं का समर्थन करने के लिए एक प्रस्ताव है। यह किसी प्रोग्राम को मानों के सेट के साथ ऑब्जेक्ट बनाने की अनुमति देगा और ऑब्जेक्ट बनने के बाद उन मानों को निश्चित और अपरिवर्तनीय किया जाएगा। आप इसके बारे में यहां और अधिक पढ़ सकते हैं: https://wiki.php.net/rfc/immutability। हालांकि ध्यान दें कि यह अब PHP में नहीं है (7.0), और यह आगामी 7.1 रिलीज में भी नहीं होगा। चर्चाओं के आधार पर, यह 7.2 हो सकता है, लेकिन इस चरण में उस पर कुछ भी वादा करना बहुत जल्दी है। – Simba

उत्तर

12

PHP के लिए, सभी ऑब्जेक्ट्स म्यूटेबल हैं। चूंकि स्थिरांक को रनटाइम पर कभी नहीं बदला जाना चाहिए, लेकिन ऑब्जेक्ट्स, ऑब्जेक्ट-कॉन्स्टेंट वर्तमान में समर्थित नहीं हैं।

phpdoc about constants में, यह कहा गया है कि:

स्थिरांक कीवर्ड, केवल अदिश डेटा (बूलियन, पूर्णांक, नाव और स्ट्रिंग) का उपयोग करते समय पीएचपी 5.6 से पहले स्थिरांक में समाहित किया जा सकता है। PHP 5.6 के बाद, एक स्केलर अभिव्यक्ति के रूप में निरंतर परिभाषित करना संभव है, और एक सरणी निरंतर परिभाषित करना भी संभव है। संसाधनों के रूप में स्थिरांक को परिभाषित करने के लिए संभव है, लेकिन इसे से बचा जाना चाहिए क्योंकि इससे अप्रत्याशित परिणाम हो सकते हैं।

हालांकि सरणी के साथ एक असंगतता है और क्यों कोई तर्कसंगत नहीं है कि सरणी स्थिरांक की अनुमति क्यों है। (मैं भी तर्क था कि यह एक बुरा फोन था।) यह ध्यान दिया जाना चाहिए कि array-constants अपरिवर्तनीय हैं, इसलिए के रूप में php7 से इस कोड द्वारा प्रदर्शन किया उन्हें गंभीर त्रुटि में परिणामों को बदलने की कोशिश कर रहा:

<?php 
$aNormalMutableArray = ['key' => 'original']; 
$aNormalMutableArray['key'] = 'changed'; 
echo $aNormalMutableArray['key']; 

define(
    'IMMUTABLE_ARRAY', 
    [ 
     'key' => 'original', 
    ] 
); 
IMMUTABLE_ARRAY['key'] = 'if I am an array, I change; if I am a constant I throw an error'; 
echo IMMUTABLE_ARRAY['key']; 

फेंक:

PHP Fatal error: Cannot use temporary expression in write context 
in ~/wtf.php on line 12 

ऑब्जेक्ट स्थिरांक को समान त्रुटि के साथ परिभाषित करना क्यों संभव नहीं है? किसी को वह शक्ति पूछनी है जो हो।

मैं सरणी के रूप में सरणी और वस्तुओं से दूर रहने की सलाह देते हैं। इसके बजाय एक अपरिवर्तनीय वस्तुएं बनाएं या इसके बजाय immutable collections का उपयोग करें।

चूंकि आप एक निश्चित वाक्यविन्यास की तलाश में हैं, वहां पहले से ही class constants की अवधारणा है।

<?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 

इंटरफ़ेस में उन्हें परिभाषित करना भी संभव है।

+0

आपके उत्तर के लिए धन्यवाद। कक्षा स्थिरांक में मुझे php फ़ाइल में सभी स्थिरांक "हार्डकोड" करना होगा, लेकिन मैं इसे गतिशील बनाना चाहता हूं, इसलिए जब मैं डेटाबेस सेटिंग तालिका में एक नई पंक्ति बनाता हूं, तो यह सेटिंग के रूप में उपलब्ध होता है। लेकिन कक्षा स्थिरांक के साथ यह संभव नहीं है। अगर यह समझ में आता है। यही कारण है कि मैं निरंतर सरणी का उपयोग करता हूं। – JemoeE

+0

@ user245734 हालांकि सराहना की, टिप्पणियां धन्यवाद के लिए नहीं हैं। यह उत्तर देने या उत्तर स्वीकार करने के लिए पर्याप्त है :) – k0pernikus

+0

@ user245734 और सभी अनुवर्ती हार्डकोड से बचने के लिए आपके अनुवर्ती प्रश्न के अनुसार: यह एक अनुवर्ती प्रश्न है और पूरी तरह से आपके मूल प्रश्न के दायरे में नहीं है। एक नया सवाल खोलने के लिए स्वतंत्र महसूस करें। – k0pernikus

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

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