PHP की छुपी हुई विशेषताएँ [बन्द है]


174

मुझे पता है कि यह एक बिंदु-सवाल की तरह लग रहा है, लेकिन मुझे समझाने दो कि मैं कहाँ से आ रहा हूँ।

कॉलेज से बाहर मुझे एक PHP शॉप में नौकरी मिल गई। मैंने वहां डेढ़ साल तक काम किया और मुझे लगा कि प्रोग्रामिंग के बारे में जानने के लिए मैंने वहीं सीखा है।

तब मुझे एक बड़े निगम में एक आदमी की आंतरिक विकास की दुकान के रूप में नौकरी मिली जहाँ सारा काम C # में था। स्थिति के प्रति मेरी प्रतिबद्धता में मैंने ब्लॉग और पुस्तकों का एक टन पढ़ना शुरू किया और जल्दी से महसूस किया कि मुझे लगता है कि मैं सब कुछ जानता था कि कितना गलत था। मैंने यूनिट परीक्षण, निर्भरता इंजेक्शन और डेकोरेटर पैटर्न, ढीली कपलिंग के डिजाइन सिद्धांत, विरासत बहस पर रचना और इतने पर और इसके बारे में सीखा - मैं अभी भी बहुत ज्यादा यह सब अवशोषित कर रहा हूं। कहने की आवश्यकता नहीं कि मेरी प्रोग्रामिंग शैली पिछले वर्ष में पूरी तरह से बदल गई है।

अब मैं अपने आप को एक दोस्त के स्टार्ट-अप के लिए कुछ कोडिंग कर रहा एक php प्रोजेक्ट उठा रहा हूं और C # में प्रोग्रामिंग के विपरीत पूरी तरह से विवश महसूस करता हूं। यह वास्तव में मुझे परेशान करता है कि एक वर्ग दायरे के सभी चर को '$ this->' को जोड़कर संदर्भित करना होगा। यह मुझे गुस्सा दिलाता है कि मैंने जो भी IDE की कोशिश की है उनमें से कोई भी बहुत अच्छा नहीं है और मेरी SimpleTest इकाई परीक्षण विधियों को 'परीक्षण' शब्द से शुरू करना है। यह मुझे पागल कर देता है कि डायनामिक टाइपिंग मुझे स्पष्ट रूप से निर्दिष्ट करने से रोकती है कि कौन सा पैरामीटर प्रकार एक विधि की अपेक्षा करता है, और आपको विधि अधिभार करने के लिए एक स्विच स्टेटमेंट लिखना होगा। मैं यह नहीं कह सकता कि आपके पास नेस्टस्पेस नाम नहीं हो सकते हैं और बेस क्लास के कंस्ट्रक्टर को कॉल करने के लिए :: ऑपरेटर का उपयोग करना होगा।

अब मेरा PHP बनाम C # बहस शुरू करने का कोई इरादा नहीं है, बल्कि मेरे कहने का मतलब यह है कि मुझे यकीन है कि कुछ PHP विशेषताएँ हैं जिनके बारे में मुझे या तो नहीं पता है या जिनके बारे में अभी तक ठीक से उपयोग करने में विफल हैं। मैं अपने सी # ब्रह्मांड में सेट हूं और कांच के कटोरे के बाहर देखने में परेशानी हो रही है।

तो मैं पूछ रहा हूँ, PHP की आपकी पसंदीदा विशेषताएँ क्या हैं? ऐसी कौन सी चीजें हैं जो आप इसमें कर सकते हैं जो आप .net भाषाओं में नहीं कर सकते हैं या अधिक कठिन हैं?


टूटा हुआ ऊ प्रतिमान? मेरे लिए यह सबसे खराब "छिपी हुई" विशेषता है जिसे आप खोजते हैं।
knoopx

ये सूत्र थोड़े मज़ेदार हैं ... क्योंकि मैं जिस टीम के लिए "हिडन फीचर" के साथ काम करता हूं, वह एक कोड वाक्यांश है जिसका अर्थ है "बग"। और आप जानते हैं कि ... कभी-कभी एक छिपी हुई विशेषता की खोज करना जरूरी नहीं है कि अच्छी बात है ...
गणेश शंकर

@ गणेश एक आदमी की बग में एक और शख्स छिपा हुआ फीचर है ...
Xeoncross

जवाबों:


328

प्रलेखनप्रलेखन मेरा वोट हो जाता है। मुझे एक प्रोग्रामिंग लैंग्वेज के लिए अधिक गहन ऑनलाइन प्रलेखन का सामना नहीं करना पड़ा - बाकी सब कुछ मुझे विभिन्न वेबसाइटों और मैन पेजों से एक साथ करना होगा।


60
मैं सहमत हूँ। Www.php.net/function_name टाइप करने में सक्षम होने के नाते और अधिकांश समय एक संदर्भ प्राप्त करना महान है।
Allain लालोंडे

1
यह PHP की एक बड़ी विशेषता है, लेकिन मैं वास्तव में इसे छिपाना नहीं कहूंगा ... यदि आपने कभी विधि मापदंडों के लिए गुगली की है, आदि, तो आप php.net पर समाप्त हो जाएंगे।
जॉन Bubriski

27
मैं भी सहमत हूँ। मैनुअल के बारे में सबसे बड़ी बात उपयोगकर्ता टिप्पणियां हैं। मैंने शायद ही कभी देखा हो कि अन्य दस्तावेज़ों में ऐसा है। उनमें असली रत्न हो सकते हैं। केवल नकारात्मक यह है कि IMHO वे बहुत जल्द ही एक छोटे से छंटनी कर रहे हैं।
सैंडर मारेचल

3
@Phoexo "थोड़ा कम पढ़ा-लिखा" ??? मैंने कभी भी MSDN को नहीं समझा और कभी नहीं समझूंगा, जबकि PHP डॉक्स आसान और स्पष्ट हैं।
लौरी

3
सहमत नहीं हैं। एकमात्र कारण यह है कि प्रलेखन "अच्छा" है क्योंकि आधिकारिक टिप्पणियों में सभी छेदों को प्लग करने वाले कुछ उपयोगकर्ता टिप्पणियों के कारण है।
रोब हावर्ड

179

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


11
PHP सरणी तत्वों का आदेश दिया जाता है।
user8134

117
PHP से C # की मेरी प्रारंभिक चाल ने मुझे लगभग मार दिया। C # में, सरणियाँ केवल एक स्थिर संरचना और संख्यात्मक सूचकांक के साथ एक सरल संरचना हैं। PHP में, सरणियाँ ब्रह्मांड की डक्ट टेप हैं!
दीना

4
मैं भी सहमत हूं। जब एक यूनी असाइनमेंट के लिए जावा के साथ खेल रहा था, तो मैं दंग रह गया कि वे कितने कठोर थे, कोई लचीलापन नहीं था। वास्तव में मुझे सराहना की है कि बस PHP सरणियाँ कितनी अच्छी हैं।
क्रिश्चियन

11
मुझे यकीन है कि php सरणियाँ महान हैं, लेकिन टिप्पणी के लिए 40 वोट जो सी # सरणियों को दस्तक देते हैं? यदि कोई C # सरणी आवश्यकता के अनुरूप नहीं है, तो कई विकल्प हैं। ArrayList और सामान्य संग्रह दोनों ही बहुत शक्तिशाली हैं। विशिष्ट आवश्यकताओं के लिए कई प्रकार के संग्रह हैं। इस संबंध में php का एकमात्र वास्तविक लाभ यह है कि यह कोई विकल्प प्रदान नहीं करता है जिससे एक प्रोग्रामर को निर्णय लेना चाहिए। आप या तो सरणी का उपयोग करते हैं या आपके पास एक अनुक्रमणिका चर नहीं है।
जी-विज

24
दूसरी ओर, सरणियों के लिए वाक्यविन्यास पूरी तरह से बेकार है। कई स्क्रिप्टिंग भाषाओं में आप एक सरल 2 डी सरणी बना सकते हैं जैसे: [[1, 2], [3, 4]]PHP संस्करण से इसकी तुलना करें array(array(1, 2), array(3, 4)):।
रेने सारसो

167

स्ट्रीम हैंडलर आपको "फाइलसिस्टम" को तर्क के साथ विस्तारित करने की अनुमति देते हैं, जहां तक ​​मुझे पता है कि अधिकांश अन्य भाषाओं में करना काफी मुश्किल है।

MS-Excel स्ट्रीम हैंडलर के साथ उदाहरण के लिए आप निम्न तरीके से MS Excel फ़ाइल बना सकते हैं:

$fp = fopen("xlsfile://tmp/test.xls", "wb");
if (!is_resource($fp)) { 
    die("Cannot open excel file");
}

$data= array(
    array("Name" => "Bob Loblaw", "Age" => 50),  
    array("Name" => "Popo Jijo", "Age" => 75),  
    array("Name" => "Tiny Tim", "Age" => 90)
); 

fwrite($fp, serialize($data));
fclose($fp);

मेरा मानना ​​है कि KIO फ्रेमवर्क आपको ऐसा करने देता है, लेकिन यह केवल KDE- आधारित डेस्कटॉप अनुप्रयोगों के लिए उपलब्ध है।
MiffTheFox

21
IMO का उचित OO दृष्टिकोण स्ट्रीम हैंडलर्स के साथ इस गड़बड़ की तुलना में बहुत अधिक समझदार होगा। हाँ, इसका प्यारा एक्सेल फ़ाइलों को पढ़ने / लिखने में सक्षम है, लेकिन क्या इस तरह से काम करना है?
एंटी वीराना

3
हो सकता है कि ऐसा हो, लेकिन यह दृष्टिकोण एक ऐसे इंटरफ़ेस में जटिलता को कूटबद्ध करता है जो अधिकांश PHP डेवलपर्स के लिए सामान्य है ... उन्हें ऑब्जेक्ट ओरिएंटेड अवधारणाओं को सीखने की आवश्यकता के बिना जो उनसे परे हो सकता है।
एलन लालडेन्ग

13
यदि आप अमेज़न S3 के साथ काम कर रहे हैं, तो Zend_Amazon_S3 देखें, जो 's3: // {बाल्टी-नाम} / पथ' जैसे यूआरएल के लिए एक स्ट्रीम इंटरफ़ेस प्रदान करता है।
दाविदबर्तनल

मैंने इसे केवल PHP फ़ाइल को पढ़ने, कुछ स्ट्रिंग प्रतिस्थापन करने और इसे गर्त निकालने () से गुजरते हुए अपने दृश्य परत के लिए एक साधारण डीएसएल बनाने के लिए उपयोग किया है। उदाहरण के लिए, मैंने इसे ऐसा बनाया है कि जब भी मैं चुनूं और करूँ, तब मैं शॉर्ट-टैग्स का उपयोग कर सकूँ - someVar ताकि मैं व्यू-स्तरीय डेटा तक पहुँच सकूँ।
जैस्पर बेकर्स

131

मैजिक मेथड्स फॉल-थ्रू मेथड्स होते हैं, जिन्हें आप जब भी कोई ऐसा तरीका इजाद करते हैं, जो मौजूद नहीं होता है या ऐसी प्रॉपर्टी को अडॉप्ट या असाइन नहीं करता है, जो अन्य चीजों के बीच मौजूद नहीं है।

interface AllMagicMethods {
    // accessing undefined or invisible (e.g. private) properties
    public function __get($fieldName);
    public function __set($fieldName, $value);
    public function __isset($fieldName);
    public function __unset($fieldName);

    // calling undefined or invisible (e.g. private) methods
    public function __call($funcName, $args);
    public static function __callStatic($funcName, $args); // as of PHP 5.3

    // on serialize() / unserialize()
    public function __sleep();
    public function __wakeup();

    // conversion to string (e.g. with (string) $obj, echo $obj, strlen($obj), ...)
    public function __toString();

    // calling the object like a function (e.g. $obj($arg, $arg2))
    public function __invoke($arguments, $...);

    // called on var_export()
    public static function __set_state($array);
}

यहाँ एक C ++ डेवलपर देख सकता है, कि PHP कुछ ऑपरेटरों को ओवरलोड करने की अनुमति देता है, जैसे ()या (string)। वास्तव में PHP अधिक लोडिंग की अनुमति देता है, उदाहरण के लिए []ऑपरेटर ( ArrayAccess ), foreachभाषा निर्माण ( Iterator और IteratorAggregate ) और countफ़ंक्शन ( गणनीय )।


4
जादू के तरीकों से क्या हासिल किया जा सकता है, इसके उपयोगी उदाहरण के रूप में गोटो phpcodetips.blogspot.com/2008/07/domain-model-validation.html
grom

6
सहमत नहीं हैं। यह स्मॉलटाकल, रूबी और पायथन में समान सुविधाओं से कहीं अधिक कमजोर है (और संभवतः इसे इनमें से एक से कॉपी किया गया था)
फिन जुव

34
तथ्य यह है कि PHP की इस कार्यक्षमता का कार्यान्वयन अन्य भाषाओं की तुलना में कमजोर है, यह PHP में इसे कम उपयोगी नहीं बनाता है।
एलेन लालोंडे

2
__call()महान नक्शा domain.com/controller/method/ साथ चौखटे में है
एलेक्स

7
जादू के तरीके भी नरक के रूप में धीमी हैं। उनका उपयोग सावधानी से करें।
एलेक्स वीनस्टीन

95

मानक वर्ग एक साफ कंटेनर है। मैंने केवल इसके बारे में हाल ही में सीखा है।

सर्वर संबंधी विशेषताओं को रखने के लिए एक सरणी का उपयोग करने के बजाय

$person = array();
$person['name'] = 'bob';
$person['age'] = 5;

आप एक मानक वर्ग का उपयोग कर सकते हैं

$person = new stdClass();
$person->name = 'bob';
$person->age = 5;

स्ट्रिंग में इन चरों तक पहुँचने पर यह विशेष रूप से सहायक होता है

$string = $person['name'] . ' is ' . $person['age'] . ' years old.';
// vs
$string = "$person->name is $person->age years old.";

43
{{$ person ['name']} {$ person ['age']} वर्ष पुराना है।
कोर्नेल

27
"व्यक्ति [नाम] $ व्यक्ति [उम्र] वर्ष का है" भी काम करेगा ... कोई उद्धरण नहीं, कोई ब्रेसिज़ नहीं :)
majelbstoat

16
$ स्ट्रिंग = स्प्रिंटफ ("% s% d साल पुराना है।", $ व्यक्ति ['नाम'], $ व्यक्ति ['उम्र']);
डैनियल स्लॉफ़

60
जब हम इस विषय पर हैं: (ऑब्जेक्ट) सरणी ("नाम" => 'बॉब', 'उम्र' => 5)
अन्निका बैकस्ट्रॉम

30
@majelbstoat: उद्धरण लेना स्क्रिप्ट को धीमा कर देगा क्योंकि PHP दुभाषिया यह देखेगा कि क्या 'नाम' और 'आयु' को परिभाषित (...) के साथ सेट किया गया है। यह भी एक बुरा व्यवहार है कि यह विचार करना संभव है कि प्रत्येक मामले में एक्सेस की जाने वाली कुंजियों को पूरी तरह से फ्लिप किया जाए: परिभाषित ('उम्र', 'नाम'); ( 'नाम', 'युग') को परिभाषित;
brianreavis

90

फ़ाइलें शामिल कर सकते हैं एक वापसी मूल्य आप एक चर के लिए असाइन कर सकते हैं।

// config.php
return array(
    'db' => array(
        'host' => 'example.org',
        'user' => 'usr',
        // ...
    ),
    // ...
);

// index.php
$config = include 'config.php';
echo $config['db']['host']; // example.org

@Peter डीबी-> लोकलहोस्ट अपवाद त्रुटि हैंडलिंग के लिए बहुत उपयोगी है।
तलवी वटिया

त्वरित और गंदे कॉन्फिग फ़ाइल को सेट करने के लिए यह सुविधाजनक है।
फ्रैंक किसान

आप यह सरणी क्यों लौटाते हैं? यदि एक सम्मिलित फ़ाइल में एक सरणी होती है तो यह तुरंत शामिल करने योग्य होती है।
fabrik

5
@ फैब्रिक क्योंकि यह वैश्विक चर होगा और पूरे मुख्य दायरे में उपलब्ध होगा। यह काफी अप्रिय है, यह बेहतर तरीका है।
मिकुलस डाइट

मैंने Yii फ्रेमवर्क में एक प्रोजेक्ट पर काम किया है और उस प्रोजेक्ट में कॉन्फिग फाइल है, जिसमें एरे को इस तरह से लौटाया गया है, अब मैं समझता हूं कि फाइल इस तरह क्यों थी।
सिमर ट्विलियो टोरंटो डेवलपर

83

आप इस तथ्य का लाभ उठा सकते हैं कि orऑपरेटर =को ऐसा करने की तुलना में कम वरीयता है :

$page = (int) @$_GET['page'] 
  or $page = 1;

यदि पहले असाइनमेंट का मान मूल्यांकन करता है true, तो दूसरे असाइनमेंट को अनदेखा कर दिया जाता है। एक और उदाहरण:

$record = get_record($id) 
  or throw new Exception("...");

7
मुझे लगता है कि मैं इस बारे में बहुत आश्वस्त नहीं हूँ; भले ही ऐसा लगता है कि यह त्रुटि रहित नहीं है, लेकिन यह काउंटर-सहज ज्ञान युक्त है और यह अपने आप त्रुटियों को बढ़ावा दे सकता है।
थोमसट्रेटर

14
@Pies: एक तरीका निम्नलिखित है, ईमानदार होने के लिए काफी गन्दा कोड: $ पेज = isset ($ _ GET ['पेज'])? (int) $ _ GET ['पेज']: 1; // इसका लाभ यह है कि कोई त्रुटि दमन की आवश्यकता नहीं है।
असंतुष्ट

3
दूसरे विचारों पर, जब से आप एक पूर्णांक की तलाश कर रहे हैं, जिसके बजाय आप उपयोग कर सकते हैं: $ पेज = is_int ($ _ GET ['पृष्ठ]])? $ _GET ['पेज']: 1;
असंतुष्टगीत

4
यह ध्यान देने योग्य है कि कोड के बाद कोड orनिष्पादित करेगा यदि कोड orसंख्यात्मक मान में परिणाम से पहले 0। इसलिए शब्दार्थ यह कुछ होने की संभावना के साथ कम हो सकता है $_GET['page'], लेकिन जाहिर है कि स्थिति उत्पन्न हो सकती है और इसके लिए बाहर देखना अच्छा है।
आंखों की रोशनी

3
यह भी ध्यान देने योग्य है कि orऑपरेटर ऑपरेटर का निचला-पूर्ववर्ती संस्करण है ||। इसके अलावा, +1 क्योंकि यह अत्यधिक अभिव्यंजक है और मैं अक्सर यह भूल जाता हूं कि यह संभव है। इसका उपयोग अधिक बार किया जाना चाहिए, और यह जो करता है उसमें बिल्कुल स्पष्ट है। मुझे हालांकि "असली नर" कोड के बारे में पता नहीं है, इसलिए मैं उस पर टिप्पणी नहीं कर सकता।
आंखों की रोशनी

80

__autoload()(वर्ग-) द्वारा सहायता प्राप्त फाइलें set_include_path()

PHP5 में, जब सभ्य OOP कर रहे हैं, तो "शामिल_न" बयानों की लंबी सूची निर्दिष्ट करना अनावश्यक है।

बस निर्देशिका के एक छोटे से सेट को परिभाषित करें जिसमें कक्षा-पुस्तकालय की फाइलें पूरी तरह से संरचित हैं, और सेट करें ऑटो में पथ शामिल है:

set_include_path(get_include_path() . PATH_SEPARATOR . '../libs/');`

अब __autoload()दिनचर्या:

function __autoload($classname) {
    // every class is stored in a file "libs/classname.class.php"

    // note: temporary alter error_reporting to prevent WARNINGS
    // Do not suppress errors with a @ - syntax errors will fail silently!

    include_once($classname . '.class.php');
}

अब PHP स्वचालित रूप से आवश्यक फ़ाइलों को ऑन-डिमांड, पार्सिंग समय और मेमोरी को संरक्षित करना शामिल करेगी।


क्या spl_autoload_register () का उपयोग करना बेहतर है?
एलेक्स

19
बेशक! __autoload () PHP4 है, लेकिन spl_autoload_register () एक गैर-विनाशकारी "डेज़ी-चेनिंग" है जो ऑटोलोडिंग विधियों का है।
विलेम

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

यह एक अच्छी सुविधा है, लेकिन केवल कोड नहीं होने की स्थिति के आसपास पाने के लिए, इसलिए यह नहीं पता कि कक्षा कहां होने जा रही है। इसका बड़ा पहलू यह है कि आपके पास एक ही नाम के साथ 2 कक्षाएं नहीं हो सकती हैं, भले ही वे विभिन्न नामस्थानों में हों।
कबि

3
कृपया ऑटोलॉडिंग को लागू करते समय PHP मानकों वर्किंग ग्रुप (ZF, सिम्फनी, डॉक्ट्रिन, CakePHP, सौर, आदि के डेवलपर्स की विशेषता) से PSR-0 प्रॉपर पर एक नज़र डालें: group.google.com/group/php-standards/web / पीएसआर-०-अंतिम-प्रस्ताव
फिलिप गेर्बर

76

सहजता । सबसे बड़ी विशेषता यह है कि नए डेवलपर्स के लिए "वर्किंग" स्क्रिप्ट लिखना और कोड को समझना कितना आसान है।

सबसे खराब विशेषता यह है कि नए डेवलपर्स के लिए बैठना और "काम करना" स्क्रिप्ट लिखना कितना आसान है और उन्हें लगता है कि वे कोड को समझते हैं।

PHP के आसपास के समुदाय का खुलापन और ओपन-सोर्स के रूप में उपलब्ध बड़ी मात्रा में PHP प्रोजेक्ट्स किसी के लिए विकास की दुनिया में प्रवेश करने के लिए बहुत कम डराने वाला है और आप की तरह, अधिक परिपक्व भाषाओं में कदम रख सकता है।

मैं तकनीकी चीजों पर बहस नहीं करूंगा क्योंकि मेरे पास पहले भी कई चीजें हैं लेकिन अगर आप PHP को एक वेब भाषा के बजाय एक समुदाय के रूप में देखते हैं, तो एक समुदाय जो स्पष्ट रूप से आपको गले लगाता है जब आपने विकास करना शुरू किया था, तो लाभ वास्तव में खुद के लिए बोलते हैं।


3
निश्चित रूप से एक अच्छी टिप्पणी। पायथन मेरी पहली भाषा थी और यह कमाल की थी, लेकिन जिन प्रोजेक्ट्स को मैंने समझने में सक्षम महसूस किया उनमें कमी ने अवरोध पैदा किया। PHP के साथ मैं प्रलेखन पर बहुत कुछ देख सकता हूं और यह पता लगा सकता हूं ... वेब पर उपलब्ध संसाधन अद्भुत हैं।
dscher

76

एक संदेह के बिना चर और कार्यों !

$foo = 'bar';
$bar = 'foobar';
echo $$foo;    //This outputs foobar

function bar() {
    echo 'Hello world!';
}

function foobar() {
    echo 'What a wonderful world!';
}
$foo();    //This outputs Hello world!
$$foo();    //This outputs What a wonderful world!

एक ही अवधारणा वस्तु मापदंडों पर लागू होती है ($ some_object -> $ some_variable);

बहुत बहुत अच्छा। लूप और पैटर्न के साथ कोडिंग करना बहुत आसान है, और यह eval (Thanx @Ross & @Joshi Spawnbrood!) T की तुलना में तेज़ और अधिक नियंत्रण में है।


111
चर चर वास्तव में कोड को कम पठनीय और त्रुटियों के लिए अधिक प्रवण बना रहे हैं।
एल्जो वालुगी

8
और लोग वास्तव में इसका इस्तेमाल करते हैं? यार मुझे इन स्रोतों को पढ़ने से नफरत होगी।
गैरी विलोबी

27
वैरिएबल वैरिएबल PHP के सबसे बुरे फीचर्स में से एक है।
दाविदबर्तनल

10
10 में से 9 बार परिवर्तनशील चर को सरणियों के साथ बेहतर रूप से प्रतिस्थापित किया जाता है ताकि आपके पास एक ही स्थान पर सभी डेटा हो, आप इसे एट वगैरह पर पुनरावृत्त कर सकते हैं। केवल कुछ विशिष्ट परिस्थितियों में ही वे उपयोगी हो सकते हैं।
जैस्पर बेकर्स

7
कृपया newbies का उपयोग करें कि "सुविधा" नहीं है।
व्हिस्कीसेरा

68

आप उपयोग कर सकते हैं तर्कों की एक अपरिभाषित संख्या के साथ काम करता है का उपयोग कर func_get_args()

<?php

function test() {

    $args = func_get_args();
    echo $args[2]; // will print 'd'
    echo $args[1]; // will print 3
}

test(1,3,'d',4);

?>

1
बस यह पोस्ट करने वाला था। जेएस कार्यों में तर्क संपत्ति की तरह।
एलेक्स

67

मुझे रिमोट फाइल्स बहुत पसंद हैं । वेब विकास के लिए, इस तरह की सुविधा असाधारण रूप से उपयोगी है।

एक वेब पेज की सामग्री के साथ काम करने की आवश्यकता है? एक सरल

$fp = fopen('http://example.com');

और आपको किसी अन्य सामान्य फ़ाइल की तरह ही एक फ़ाइल संभालनी है।

या कैसे एक दूरस्थ फ़ाइल या वेब पेज को सीधे एक स्ट्रिंग में पढ़ने के बारे में?

$str = file_get_contents('http://example.com/file');

इस विशेष विधि की उपयोगिता अतिरंजित करने के लिए कठिन है।

एक दूरस्थ छवि का विश्लेषण करना चाहते हैं? एफ़टीपी के माध्यम से इसे कैसे करें?

$imageInfo = getimagesize('ftp://user:password@ftp.example.com/image/name.jpg');

लगभग कोई भी PHP फ़ंक्शन जो फ़ाइलों के साथ काम करता है, दूरस्थ फ़ाइल के साथ काम कर सकता है। तुम भी include()या require()कोड फ़ाइलों को दूर से इस तरह से कर सकते हैं।


2
यह बहुत अच्छा है! उदाहरण के लिए जावा में ऐसा करने के लिए आपको एक गजिल जार फ़ाइलों को शामिल करना होगा और बहुत सारे बॉयलरप्लेट कोड लिखना होगा।
Kimble

16
"आप इस प्रकार दूरस्थ रूप से () या आवश्यकता () कोड फ़ाइलों को शामिल कर सकते हैं।" बेशक, एक सर्वर पर एक फ़ाइल शामिल करना () जिसे आप नियंत्रित नहीं करते हैं वह एक भयानक, भयानक विचार है।
फ्रैंक किसान

4
@ फ्रेंक - हाँ, ठीक है, एक मान लेगा कि आप एक सर्वर से कोड शामिल करेंगे जिसे आपने नियंत्रित किया था
zombat

1
बिंदु जा रहा है, दूरस्थ फ़ाइल समावेशन एक सामान्य PHP सुरक्षा मुद्दा है: en.wikipedia.org/wiki/Remote_File_Inclusion#PHP
फ्रैंक किसान

63

strtr ()

यह बहुत तेज है, इतना है कि आप चकित हो जाएगा। आंतरिक रूप से यह शायद अपने सामान्य उपसर्गों द्वारा आपके मैचों को व्यवस्थित करने के लिए कुछ पागल बी-ट्री प्रकार की संरचना का उपयोग करता है। मैं इसे 200 से अधिक ढूंढने और तारों को बदलने के लिए उपयोग करता हूं और यह अभी भी 100 एमबी से कम में 1 एमबी से गुजरता है। सभी के लिए लेकिन तुच्छ रूप से छोटे तार स्ट्रेट () स्ट्रेटोलॉवर () की तुलना में काफी तेज होते हैं, एक ही काम करते हैं, यहां तक ​​कि चरित्र सेट को भी ध्यान में रखते हैं। आप शायद लगातार स्ट्रेट कॉल का उपयोग करके एक संपूर्ण पार्सर लिख सकते हैं और यह सामान्य रेगुलर एक्सप्रेशन मैच से अधिक तेज़ होगा, टोकन टाइप, आउटपुट इस या उस, अगले रेगुलर एक्सप्रेशन प्रकार की।

मैं शब्दों में पाठ को विभाजित करने के लिए एक टेक्स्ट नॉर्मलाइज़र लिख रहा था, कम करना, विराम चिह्न आदि को हटाना और स्ट्रॉ मेरा स्विस आर्मी चाकू था, इसने नियमित भावों या यहाँ तक कि str_replace () से पैंट को हरा दिया।


1
यह शायद तेज है क्योंकि यह एकल चरित्र प्रतिस्थापन करता है।
स्टेटिक्सन

10
स्ट्रेट () केवल एकल-वर्ण प्रतिस्थापन नहीं करता है। यह अन्य मनमानी-लंबाई वाले सबस्ट्रिंग के साथ मनमानी-लंबाई वाले सबस्ट्रिंग की जगह ले सकता है, और यह अभी भी वास्तव में तेज़ लगता है।
थोमसट्रेटर

1
आपने उल्लेख किया था कि यह कुछ मामलों में स्ट्रेटोलॉवर से तेज था, क्या आप इसे साबित कर सकते हैं? मैंने एक छोटा बेंचमार्क किया और इसे झूठा पाया।
पिक्सेल डेवलपर

1
मैंने पाया कि 80 पात्रों के छोटे तारों पर यह स्ट्रेटोलॉवर की तुलना में धीमा था, और 1 एमबी कहने के बड़े तार पर यह तेज था। हर बार कहे जाने वाले समय में कुछ निश्चित लागत प्रकार ओवरहेड होता है। मैं बस स्ट्रेट ($ यह-> स्ट्रिंग, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') का उपयोग कर रहा था; मैं जिस स्ट्रिंग पर काम कर रहा था, वह कुछ विशिष्ट अंग्रेजी पाठ ("द क्विक ब्राउन फोक्स", उस प्रकार की) थी।
थोमसट्रेटर

मैंने अभी इस पोस्ट को पढ़ा और फिर कुछ Google सर्च किया और पाया: simplemachines.org/community/index.php?topic=175031.0 कोई भी विचार जो सही है?
फ्लिपर

61

PHP की इतनी अच्छी तरह से ज्ञात विशेषता नहीं है extract(), एक फ़ंक्शन है जो स्थानीय नामस्थान में एक साहचर्य सरणी को अनपैक करता है। यह शायद ऑटोग्लोडीम गर्भपात के लिए मौजूद है लेकिन टेंपलेटिंग के लिए बहुत उपयोगी है:

function render_template($template_name, $context, $as_string=false)
{
    extract($context);
    if ($as_string)
        ob_start();
    include TEMPLATE_DIR . '/' . $template_name;
    if ($as_string)
        return ob_get_clean();
}

अब आप उपयोग कर सकते हैं render_template('index.html', array('foo' => 'bar'))और केवल टेम्पलेट में $fooमान "bar"दिखाई देता है।


15
मैं किसी भी तरह से अर्क () का सुझाव देने के लिए आप पर गुस्सा करने वाला था, एक अच्छी विशेषता थी। लेकिन मुझे लगता है कि इसका उपयोग बहुत आसान है। मुझे लगता है कि यह एक बार मैंने देखा है जहां यह एक अच्छा विचार है!
थोमसट्रेटर

5
अर्क () यह आपके स्वयं के अत्यंत हल्के वजन वाले टेम्पलेटिंग सिस्टम को रोल करने के लिए सरल बनाता है। +1
दीना

14
इसका उलटा, कॉम्पैक्ट (), साथ ही अच्छा है: $ a = 1; $ बी = 2; कॉम्पैक्ट ('ए', 'बी'); // == सरणी ('a' => $ a, 'b' => $ b)
अन्निका बैकस्ट्रॉम

2
हाँ, यह संभवतः अर्क का एकमात्र अच्छा उपयोग है ()।
स्टेटिक्सन

4
मैं इस मामले में फ़ंक्शन तर्क नामों के रूप में सामान्य शब्दों का उपयोग नहीं करने का सुझाव दूंगा, क्योंकि $ संदर्भ, जिसमें से आप निकालते हैं () में 'as_string' या 'template_name' अनुक्रमित पर मान हो सकते हैं। EXTR_SKIP का उपयोग करना स्वीकार्य है, लेकिन केवल समस्या को कहीं और ले जाता है (अर्थात यदि टेम्पलेट $ as_string की उम्मीद कर रहा है तो उसे इसके लिए गलत मान मिलेगा।)
Michał Tatarynowicz

52

सीमा () प्रति से छिपा नहीं है, लेकिन मैं अभी भी बहुत से लोगों को इसके साथ परेशान देखता हूं:

for ($i=0; $i < $x; $i++) { 
    // code...
}

जब वे उपयोग कर सकते हैं:

foreach (range(0, 12) as $number) {
    // ...
}

और आप जैसे साधारण काम कर सकते हैं

foreach (range(date("Y"), date("Y")+20) as $i)
{
print "\t<option value=\"{$i}\">{$i}</option>\n";
}

3
आप फ़ॉरच ($ के रूप में $ सरणी => $ मूल्य) {} कर सकते हैं जो और भी सरल है।
साइलेंटगॉस्ट

15
यह एक माइक्रो-ऑप्टिमाइज़ेशन हो सकता है, लेकिन यह ध्यान देने योग्य है कि फोरच की तुलना में बहुत तेज़ और कम मेमोरी-इंटेंसिव हैं।
JAL

3
आपको पायथन की कोशिश करनी चाहिए। यह "रेंज में i (12)" के लिए जितना सरल है, या आप अधिक कुशल xrange का उपयोग कर सकते हैं।
पोंकडूडल

2
@SilentGhost: आपको अभी भी शुरू करने के लिए एक सरणी की आवश्यकता होगी, जो हमेशा ऐसा नहीं होता है। @ नई: कृपया विस्तृत करें?
एलेक

1
@flexxy, जाहिरा तौर पर, यह नहीं है। इस पर विचार करें: phpbench.com नीचे स्क्रॉल करें Read Loop
बड्डी

44

PHP सक्षम किया गया वेबस्पैन आमतौर पर (asp) .net के साथ कुछ की तुलना में कम महंगा है। आप उस सुविधा को कॉल कर सकते हैं ;-)


3
यदि आप हर एक पर विंडोज सर्वर के लिए भुगतान करने की जरूरत नहीं है, तो कई सर्वर स्थापित करना बहुत सस्ता है।
MiffTheFox

4
केवल उस जगह के बारे में मुझे पता है जहां विंडोज की लागत प्रभावी है, एक विश्वविद्यालय में है जो सर्वर सॉफ़्टवेयर पर STEEEEP छूट प्राप्त करता है, क्योंकि यह मेरे विभाग के लिए विंडोज़ की 100 प्रतियाँ खरीदने के लिए सस्ता है, क्योंकि यह लिनक्स पर हमारी प्रशंसा को प्रशिक्षित करने के लिए है (जो आंशिक रूप से मुझे दुखी करता है लेकिन उनकी विंडोज़ सेटअप साफ और अच्छी तरह से सेटअप है)।
dcousineau

4
अभी के लिए, लेकिन आपको केवल एक बार ही स्विच करना होगा, जबकि आपको नए लाइसेंस जल्द या बाद में खरीदने होंगे ...
e-satis

42

staticकीवर्ड एक OOP दृष्टिकोण की उपयोगी बाहर है। आप 'मेमॉइज़ेशन' को फौरन और आसानी से लागू कर सकते हैं या किसी चीज़ के साथ फंक्शन कैशिंग कर सकते हैं:

<?php
function foo($arg1)
{
    static $cache;

    if( !isset($cache[md5($arg1)]) )
    {
        // Do the work here
        $cache[md5($arg1)] = $results;
    }

    return $cache[md5($arg1)];
}
?>

staticकीवर्ड एक चर है कि केवल निष्पादन अतीत कि समारोह के दायरे के भीतर बनी रहती है बनाता है। यह तकनीक उन कार्यों के लिए बहुत अच्छी है जो डेटाबेस को हिट करते हैं get_all_books_by_id(...)या जैसे get_all_categories(...)कि आप पृष्ठ लोड के दौरान एक से अधिक बार कॉल करेंगे।

कैविएट: सुनिश्चित करें कि आपको अपने हैश की कुंजी बनाने का सबसे अच्छा तरीका पता है, बस हर परिस्थिति के बारे में md5(...)उपरोक्त एक अच्छा निर्णय नहीं है (गति और आउटपुट लंबाई के मुद्दे), मैंने इसका उपयोग निदर्शी उद्देश्यों के लिए किया। sprintf('%u', crc32(...))या spl_object_hash(...)संदर्भ के आधार पर बहुत बेहतर हो सकता है।


7
C / C ++
GetFree

2
@GetFree मुझे नहीं लगता कि कोई भी इस बात से इनकार करेगा कि लगभग सभी PHP को C, C ++, Perl, आदि से कॉपी किया गया है
फ्रैंक किसान

1
नकल करना सबसे अच्छा काम है जो किया जा सकता है।
निकीक

1
खराब PHP। यह हमेशा दूसरों से सुविधाओं की नकल कर रहा है। इसके बजाय सब कुछ खरोंच से लिखना चाहिए! (इस की थोड़ी सी भी संभावना को गंभीरता से लिए जाने की स्थिति में: मैं मजाक कर रहा हूं)
7zgür

42

PHP की एक अच्छी विशेषता CLI है । यह प्रलेखन में "पदोन्नत" नहीं है, लेकिन अगर आपको नियमित रूप से स्क्रिप्ट / कंसोल एप्लिकेशन की आवश्यकता है, तो क्रोन + php क्ली का उपयोग करना वास्तव में तेजी से विकसित करना है!


मुझे वास्तव में इस पर ध्यान देना चाहिए, मेरे पास कई क्रॉन जॉब्स हैं जो PHP स्क्रिप्ट के माध्यम से प्राप्त करते हैंwget http://example.com...
DisgruntledGoat

CLI स्पॉट-डीबग करने का एक शानदार तरीका भी है, क्योंकि चेतावनी / त्रुटियां आपको दिखाए बिना आपकी त्रुटि रिपोर्टिंग वरीयताओं को बदल देगी।
Glacials

40

फिर "और प्रिंट" ट्रिक

<?php $flag and print "Blah" ?>

यदि $ ध्वज सत्य है तो ब्ला ब्ला को प्रतिध्वनित करेगा। ईसीओ के साथ काम नहीं करता है।

यह टेम्प्लेट में बहुत आसान है और इसकी जगह ले सकता है? : यह वास्तव में पढ़ने के लिए आसान नहीं हैं।


24
मैं खुद एक तार्किक के मूल्यांकन शॉर्ट-कीर्स्किट का दोहन करने की तुलना में टर्नरी ऑपरेटर को अधिक स्पष्ट पाता हूं।
विसेन्ट मार्टी

26
वास्तव में वर्णों की समान संख्या है <? Php अगर ($ झंडा) प्रिंट "Blah"
बहुत ज्यादा php

3
कोष्ठक "और" टाइप करने के लिए उतना आसान नहीं है, विशेष रूप से मेरे खूनी फ्रेंच कीबोर्ड ;-) पर
ई-सतीस

7
@ सभी टिप्पणियां - यह इस बारे में नहीं है कि आप इसे कितना छोटा कर सकते हैं! यह टेम्पलेट लोगों के लिए पठनीयता और उपयोग में आसानी के बारे में है, जो कभी-कभी प्रोग्रामर भी नहीं होते हैं।
Tor Valamo

6
मैं टिप्पणी करूंगा कि यदि () कथन अधिक आसान और अधिक पठनीय है। पीएचपी में अनिवार्य रूप से 'और' ऑपरेटर के साइड इफेक्ट का फायदा उठाने की तुलना में मेरे लिए अपने सिर को प्राप्त करना आसान है, जहां गलती करना आसान है (या जब आप कोड को बाद में पढ़ते हैं तो यह गलती की तरह दिखता है)। उदाहरण के लिए, जैसा कि कहा गया है कि यह 'इको' के साथ आपके इच्छित तरीके से काम नहीं करेगा। अगर () के साथ इस तरह के गोच नहीं हैं।
2

37

आप इस तरह के चर नामों में ऋण वर्ण का उपयोग कर सकते हैं :

class style
{
  ....
  function set_bg_colour($c)
  {
    $this->{'background-color'} = $c;
  }
}

इसका उपयोग क्यों करें? कोई विचार नहीं: शायद एक सीएसएस मॉडल के लिए? या कुछ अजीब JSON आपको आउटपुट करने की आवश्यकता है। यह एक अजीब विशेषता है :)


2
क्या वह विधि नामों से काम करता है? एक राउटर का उपयोग करने वाले चौखटे के लिए उपयोगी हो सकता है और मुझे domain.com/something-with-minuses/view/ चाहिए
एलेक्स

6
घुंघराले ब्रेसिज़ आपको ऑब्जेक्ट उचितताओं तक पहुंचने की अनुमति देते हैं जिनमें डैश, डॉट्स और अन्य गैर-अल्फ़ान्यूमेरिक इकाइयां हैं। इसका उपयोग करने का एक कारण यह है कि xml के साथ काम करते समय, जहाँ संस्था के नाम NITF / NewsML <body.content> की तरह लगाए जा सकते हैं। यदि आप SimpleXML का उपयोग करते हैं, तो आप इसे इस तरह एक्सेस करेंगे $item->DataContent->body->{'body.content'}
जेसी कोचिस 20'09

2
PHP चर किसी भी वर्ण ले जा सकते हैं जब उस तरह से इस्तेमाल किया, यहां तक ​​कि रिक्त स्थान और newlines।
नौसिखिया

यह बहुत उपयोगी होगा जब SimpleXML ... भयानक में उपयोग किया जाता है। साझा करने के लिए धन्यवाद।
काइलफ्रिस

34

HEREDOC सिंटैक्स मेरी पसंदीदा छिपी हुई विशेषता है। <<< के लिए Google को ढूंढना हमेशा मुश्किल होता है, लेकिन यह आपको HTML के बड़े हिस्से से बचने के लिए रोकता है और फिर भी आपको चर में स्ट्रीम करने की अनुमति देता है।

echo <<<EOM
  <div id="someblock">
    <img src="{$file}" />
  </div>
EOM;

2
HEREDOC SQL स्टेटमेंट बनाने और उपयोग करने का मेरा पसंदीदा तरीका है।
bdl

11
नोट: समापन EOM; इंडेंट नहीं किया जा सकता।
माईकविटमैन

यदि आप टेम्प्लेट का उपयोग करते हैं तो अच्छा है, लेकिन व्यर्थ है। प्लस यह उचित इंडेंटेशन के रास्ते में मिलता है।
मानोस दिलवाराकिस

7
प्रिय भगवान, वह कोड का सबसे बदसूरत टुकड़ा मैंने कभी देखा है। यदि आप HEREDOC's का उपयोग कर रहे हैं, तो आपने प्रस्तुति को तर्क से अलग नहीं किया है।
लोटस नोट्स

@ बायरन: आपको इसे प्रस्तुति के लिए उपयोग करने की आवश्यकता नहीं है, इसका उपयोग किसी भी स्ट्रिंग के लिए किया जा सकता है। Bdl की टिप्पणी देखें।
टॉम पॉज़्रुक जुले

34

संभवतः बहुत से लोग नहीं जानते हैं कि फ़ंक्शन पैरामीटर के लिए डिफ़ॉल्ट मानों के रूप में निरंतर "चर" को निर्दिष्ट करना संभव है:

function myFunc($param1, $param2 = MY_CONST)
{
//code...
}

स्ट्रिंग्स का उपयोग किया जा सकता है जैसे कि वे एरेज़ थे :

$str = 'hell o World';
echo $str; //outputs: "hell o World"

$str[0] = 'H';
echo $str; //outputs: "Hell o World"

$str[4] = null;
echo $str; //outputs: "Hello World"

3
वह आखिरी निफ्टी है। हालांकि मुझे इस बात का कोई अंदाजा नहीं है कि किसी किरदार को हटाने का यह तरीका किसी और तरीके से बेहतर होगा। +1 फिर भी
जॉर्ज माउर

3
यह शायद ऐसा करने के लिए एक फ़ंक्शन को कॉल करने की तुलना में अधिक कुशल है। स्ट्रिंग्स को आम तौर पर स्मृति में संचित रूप से संग्रहीत किया जाता है, इसलिए $ str [4] को प्राप्त करना तुच्छ है। पात्रों के सरणियों के रूप में तार संचय करना अधिकांश भाषाओं के लिए आम है जो सी से प्राप्त होता है
sjobe

1
आपको डिफ़ॉल्ट मान के रूप में परिभाषित स्थिरांक का उपयोग करने की आवश्यकता नहीं है। निम्नलिखित भी पूरी तरह से मान्य है: फ़ंक्शन पैर ($ param1, $ default = array ('key' => 'value'), $ default_s = 'String', $ default_i = 10, $ default_b = false)। हालाँकि आप ध्यान देने योग्य हैं कि आप एक डिफॉल्ट तर्क के रूप में वैरिएबल का उपयोग नहीं कर सकते हैं।
डीसीसिन्यू

@dcousineau आपका उदाहरण सरणी के बाद से पूरी तरह से मान्य है () एक फ़ंक्शन नहीं है, लेकिन एक भाषा निर्माण है। फ़ंक्शन कॉल को तर्कों के लिए डिफ़ॉल्ट मान के रूप में अनुमति नहीं है।
जामोल २०'०

4
यदि आप मल्टी-बाइट स्ट्रिंग्स (विदेशी भाषाएं, आदि) हैं, तो एरे के रूप में स्ट्रिंग्स का इलाज करने के साथ सावधान रहें
फिल्पेरो

33

PHP कोड के बारे में सबसे उपयोगी बात यह है कि अगर मुझे कोई फ़ंक्शन समझ में नहीं आता है तो मैं देख सकता हूं कि मैं इसे एक ब्राउज़र का उपयोग करके देख सकता हूं और टाइप कर सकता हूं:

http://php.net/function

पिछले महीने मैंने कुछ कोड में "रेंज" फ़ंक्शन देखा। यह उन सैकड़ों कार्यों में से एक है जिन्हें मैं कभी उपयोग नहीं कर पाया लेकिन वास्तव में उपयोगी होना चाहिए:

http://php.net/range

वह यूआरएल http://us2.php.net/manual/en/function.range.php के लिए एक उपनाम है । यह सरल विचार, कार्यों और खोजशब्दों को यूआरएल में मैप करने का कमाल है।

मैं अन्य भाषाओं, फ्रेमवर्क, डेटाबेस, ऑपरेटिंग सिस्टम के लिए प्रलेखन देखने के लिए एक सरल तंत्र है।


5
range()के लिए उपयोगी हो सकता हैforeach( range(1, 10) as $i) { };
एलेक्स

यदि आपके पास फ़ायरफ़ॉक्स है; PHP functionएड्रेस बार में बस टाइप करें यह एक Google करेगा 'मैं भाग्यशाली महसूस कर रहा हूं' खोज और आप लगभग हमेशा सही php प्रलेखन पृष्ठ पर समाप्त होते हैं।
कोलकी

30

तेजी से ब्लॉक टिप्पणियाँ

/*
    die('You shall not pass!');
//*/


//*
    die('You shall not pass!');
//*/

यदि कोई कोड ब्लॉक एक वर्ण के साथ टिप्पणी करता है, तो ये टिप्पणियां आपको टॉगल करने की अनुमति देती हैं।


14
यह वास्तव में PHP के लिए विशिष्ट नहीं है। यह किसी भी भाषा में काम करता है जो // ...लाइन टिप्पणियों और /* ... */ब्लॉक टिप्पणियों का समर्थन करता है ।
जॉर्डन रेयान मूर

किसी भी कोड सफाई उपयोगिताओं अंत में आप इस का उपयोग करने के लिए नफरत करते हैं ...;)
Talvi Watia

3
मैंने /** /पहले और /**/बाद में भी उपयोग किया है । आप पहले स्थान को हटाकर और जोड़कर ब्लॉक को टॉगल कर सकते हैं। सीएसएस के साथ काम करने का यह एक अतिरिक्त लाभ है (और अन्य भाषाएँ जो // ... टिप्पणियों का समर्थन नहीं करती हैं )।
किंगजेफ्रे


@aleemb, इस प्रश्न के किसी भी आगे संपादन करने से बचना चाहिए।
सैम १५२

29

मेरी सूची .. उनमें से अधिकांश "पसंदीदा सुविधाओं" (मुझे आशा है!) की तुलना में "छिपी हुई विशेषताओं" के तहत अधिक आती हैं, और सभी उपयोगी नहीं हैं, लेकिन .. हाँ।

// swap values. any number of vars works, obviously  
list($a, $b) = array($b, $a);

// nested list() calls "fill" variables from multidim arrays:  
$arr = array(  
  array('aaaa', 'bbb'),  
  array('cc', 'd')  
);  
list(list($a, $b), list($c, $d)) = $arr;  
echo "$a $b $c $d"; // -> aaaa bbb cc d  

// list() values to arrays  
while (list($arr1[], $arr2[], $arr3[]) = mysql_fetch_row($res)) { .. }  
// or get columns from a matrix  
foreach($data as $row) list($col_1[], $col_2[], $col_3[]) = $row;

// abusing the ternary operator to set other variables as a side effect:  
$foo = $condition ? 'Yes' . (($bar = 'right') && false) : 'No' . (($bar = 'left') && false);  
// boolean False cast to string for concatenation becomes an empty string ''.  
// you can also use list() but that's so boring ;-)  
list($foo, $bar) = $condition ? array('Yes', 'right') : array('No', 'left');

आप टर्नरी ऑपरेटरों को भी घोंसला दे सकते हैं, कभी-कभी काम आता है।

// the strings' "Complex syntax" allows for *weird* stuff.  
// given $i = 3, if $custom is true, set $foo to $P['size3'], else to $C['size3']:  
$foo = ${$custom?'P':'C'}['size'.$i];  
$foo = $custom?$P['size'.$i]:$C['size'.$i]; // does the same, but it's too long ;-)  
// similarly, splitting an array $all_rows into two arrays $data0 and $data1 based  
// on some field 'active' in the sub-arrays:  
foreach ($all_rows as $row) ${'data'.($row['active']?1:0)}[] = $row;

// slight adaption from another answer here, I had to try out what else you could  
// abuse as variable names.. turns out, way too much...  
$string = 'f.> <!-? o+';  
${$string} = 'asdfasf';  
echo ${$string}; // -> 'asdfasf'  
echo $GLOBALS['f.> <!-? o+']; // -> 'asdfasf'  
// (don't do this. srsly.)

${''} = 456;  
echo ${''}; // -> 456  
echo $GLOBALS['']; // -> 456  
// I have no idea.  

ठीक है, मैं अभी के लिए रुक जाऊंगा :-)


हम्म, यह एक समय हो गया है ..

// just discovered you can comment the hell out of php:
$q/* snarf */=/* quux */$_GET/* foo */[/* bar */'q'/* bazz */]/* yadda */;

तो, बस पता चला कि आप किसी भी स्ट्रिंग को विधि नाम के रूप में पास कर सकते हैं यदि आप इसे घुंघराले कोष्ठक के साथ संलग्न करते हैं। आप किसी भी स्ट्रिंग को एक विधि के रूप में परिभाषित नहीं कर सकते हैं, लेकिन आप उन्हें __call () के साथ पकड़ सकते हैं, और आवश्यकतानुसार आगे की प्रक्रिया कर सकते हैं। हममम ....

class foo {
  function __call($func, $args) {
    eval ($func);
  }
}

$x = new foo;
$x->{'foreach(range(1, 10) as $i) {echo $i."\n";}'}();

रेडिट टिप्पणियों में यह छोटा रत्न मिला:

$foo = 'abcde';
$strlen = 'strlen';
echo "$foo is {$strlen($foo)} characters long."; // "abcde is 5 characters long."

आप इस तरह सीधे {} के अंदर फ़ंक्शन को कॉल नहीं कर सकते हैं , लेकिन आप चर-धारण-फ़ंक्शन-नाम का उपयोग कर सकते हैं और उन्हें कॉल कर सकते हैं! (* और * आप इस पर भी चर चर का उपयोग कर सकते हैं)


2
कृपया टर्नरी तुलना ऑपरेटर का उपयोग न करें; इससे कोड ऑबफ्यूजन होता है।
स्टेटिक्सन

वाह। यह आपकी $ GLOBALS सूची को पूरी तरह से नली कर सकता है। बुरा अभ्यास। गंभीरता से।
तलवी वटिया

क्या अभी तक एक ओब्सेस्ड पीएचपी प्रतियोगिता है?
लोटस नोट्स

ठीक है, स्वैप के साथ चाल - प्रभावशाली और उपयोगी, धन्यवाद।
OZ_

1
${''} = 456;हाहाहा .... काफी गाली।
Skurmedel

26

एरे हेर फेर।
सरणियों के साथ काम करने और हेरफेर करने के लिए उपकरण के टन। यह PHP के लिए अद्वितीय नहीं हो सकता है, लेकिन मैंने कभी ऐसी भाषा के साथ काम नहीं किया है जिसने इसे इतना आसान बना दिया है।


उदाहरण के लिए क्या पसंद है? यह मुझे ऐसा लगता है जैसे फ़ंक्शन सभी अजीब तरह से नामित और वैश्विक नामस्थान में तैनात हैं। इसके अलावा, मैं कुछ भी नहीं सोच सकता हूँ बस $ $ को छोड़कर किसी अन्य भाषा में इतना आसान नहीं है [] = मूल्यों को जोड़ने के लिए $ newvalue - thats शांत
जॉर्ज माउर

8
खैर, PHP सरणी एक डेटास्ट्रक्चर है जिसे स्टैक, क्यू, ड्यूक, लिस्ट, हैशटेबल, आदि के रूप में आसानी से उपयोग किया जा सकता है, यह वास्तव में सबसे आम जरूरतों के लिए बहुत लचीला है, बिना कुछ और का सहारा लिए लेकिन array_ * फ़ंक्शन।
कैमिलो डिआज रेपका

6
पायथन PHP की तुलना में सरणियों (सूचियों और tuples के रूप में) को बहुत बेहतर करता है।
बहुत ज्यादा php

26

मैं आप की तरह एक सा हूँ, मैं 8 साल के लिए PHP कोडित किया है। मुझे लगभग एक साल पहले .NET / C # कोर्स लेना था और मैंने वास्तव में C # भाषा (ASP.NET से नफरत) का आनंद लिया, लेकिन इसने मुझे बेहतर PHP डेवलपर बना दिया।

PHP एक भाषा के रूप में बहुत खराब है, लेकिन, मैं इसके साथ बहुत तेज हूं और LAMP स्टैक भयानक है। अंत उत्पाद भागों के योग को दूर करता है।

उस ने कहा, आपके प्रश्न के उत्तर में:

http://uk.php.net/SPL

मुझे एसपीएल से प्यार है , सी # में संग्रह वर्ग कुछ ऐसा था जो मुझे इसके साथ शुरू करते ही पसंद आया। अब मैं अपना केक बना सकता हूं और खा सकता हूं।

एंड्रयू


24

मैं थोड़ा हैरान हूं कि किसी ने अभी तक इसका उल्लेख नहीं किया है, लेकिन सरणियों के साथ मेरी पसंदीदा चाल में से एक प्लस ऑपरेटर का उपयोग कर रहा है। यह थोड़ा सा है array_merge()लेकिन थोड़ा सरल है। मैंने पाया है कि यह आमतौर पर मैं क्या चाहता हूँ। वास्तव में, यह आरएचएस में सभी प्रविष्टियों को लेता है और उन्हें एलएचएस की एक प्रति में प्रकट करता है, जो आवश्यक के रूप में ओवरराइटिंग करता है (यानी यह गैर-कम्यूटेटिव है)। एक "डिफ़ॉल्ट" सरणी के साथ शुरू करने और सभी हिट में कुछ वास्तविक मूल्यों को जोड़ने के लिए बहुत उपयोगी है, जबकि प्रदान नहीं किए गए मूल्यों के लिए डिफ़ॉल्ट मान छोड़ दें।

अनुरोध किया गया कोड नमूना:

// Set the normal defaults.
$control_defaults = array( 'type' => 'text', 'size' => 30 );

// ... many lines later ...

$control_5 = $control_defaults + array( 'name' => 'surname', 'size' => 40 );
// This is the same as:
// $control_5 = array( 'type' => 'text', 'name' => 'surname', 'size' => 40 );

$defaultsहोना चाहिए$control_defaults
diEcho

3
मुझे लगता है कि यह array_merge जितना स्पष्ट नहीं है, जब आपके पास बनाए रखने के लिए बहुत सारे कोड हों। कम से कम, जब आप उपयोग करते हैं, array_merge फ़ंक्शन, यह स्पष्ट है कि आप सरणियों के साथ काम कर रहे हैं।
सिल्वेन

और यह तथ्य कि आप कर रहे हैं ... + array( ...यह इंगित करने के लिए पर्याप्त नहीं है? :-)
स्टेटिक्सन

इसके लिए आपको PHP के किस संस्करण की आवश्यकता है?
लोटस नोट्स

यह एक महान विशेषता है और यह ध्यान दिया जाना चाहिए कि "+" के "दाईं ओर" सरणी सरणी की मौजूदा कुंजियों को "+" के "बाएं" पक्ष पर ओवर-राइट नहीं करेगी।
विल मूर III

21

यहाँ एक है, मुझे पसंद है कि कैसे फंक्शन पैरामीटर पर डिफ़ॉल्ट मान सेट नहीं किए जाते हैं जो बहुत आसान है:

function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }

4
पिछले काफी समय से मैंने पिछले सप्ताह Google रीडर में इस "छिपी हुई विशेषता" को देखा। मुझे नहीं लगता कि इसके बारे में क्या छिपा है - यह मूल वाक्यविन्यास है। उदाहरण के लिए अगर ($ var = true) कोशिश करें।
रोस

8
क्या की तुलना में आसान? अधिकांश भाषा में यह सुविधा है।
क्रिश्चियन डेवन

10
सी # की तुलना में आसान (और मुझे लगता है कि सी ++, और जावा)
जॉर्ज माउर

8
C ++ डिफ़ॉल्ट पैरामीटर मानों का समर्थन करता है।
23

2
c # डिफ़ॉल्ट मानों का समर्थन नहीं करता है। आपको एक अतिभारित फ़ंक्शन लिखना होगा और हमेशा उस मूल्य को घोषित करना होगा जो सिर्फ सादा बोझिल हो
DeveloperChris

21

त्वरित और गंदा डिफ़ॉल्ट है।
भाषा उपयोगी शॉर्टकट से भर जाती है, यह PHP को उन छोटी (छोटी) परियोजनाओं के लिए एकदम सही उम्मीदवार बनाती है जिनके पास बाज़ार में कम समय होता है। ऐसा नहीं है कि स्वच्छ PHP कोड असंभव है, यह सिर्फ कुछ अतिरिक्त प्रयास और अनुभव लेता है।

लेकिन मुझे PHP बहुत पसंद है क्योंकि यह मुझे एक निबंध टाइप किए बिना व्यक्त करने की अनुमति देता है।

पीएचपी:

if (preg_match("/cat/","one cat")) {
   // do something
}

जावा:

import java.util.regex.*;
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat")
if (m.find()) {
  // do something
}

और हाँ, जिसमें Int टाइपिंग शामिल नहीं है ।


4
आपको इसके बजाय स्ट्रैप्स का उपयोग करना चाहिए: यदि (गलत! == स्ट्रैप्स ("एक बिल्ली", "बिल्ली")) {
OIS

17
@ उसके उदाहरण का उद्देश्य एक त्वरित रेगेक्स मैच के चलने की तुलना करना और उसकी तुलना करना था, न कि "एक बिल्ली" में स्ट्रिंग "कैट" को कैसे खोजना है।
डीसीसिन्यू

19
जावा: अगर (पैटर्मा.मैचेज़ ("कैट", "वन कैट")) {// कुछ करें} अगर आपको इसकी जानकारी नहीं है तो जावा के बारे में शिकायत करना बंद करें।
व्हिस्कीसियर

3
+1 विली आप प्रीग_रेप्लेस ('/ ([<[-? \ _ *) (\ S *?) (\ S * - [>]?] / Se', "\ $ this- कैसे करते हैं? > चुनें ('\\ 1', '\\ 2', '\\ 3', \ $ डेटा) ", $ पाठ); जावा में? यह इनपुट पाठ में एक टिप्पणी पाता है और फिर मिलान वाले तत्वों के साथ एक फ़ंक्शन को कॉल करता है जो इस मामले में $ इस-> चुनें (...) के साथ मैच को बदलने के लिए क्या निर्णय लेता है और परिणाम देता है।
डेवलपरक्रिस

1
Regex PHP बहुत भद्दा है ... मैं बहुत पर्ल या जावास्क्रिप्ट शैली Regex है जहाँ //भाषा में बनाया गया है।
cdmckay
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.