Traits
Traits किस समस्या को हल करते हैं
PHP में class सिर्फ़ एक parent extends कर सकती है। पर कभी दो असंबंधित classes को एक जैसे helper methods चाहिए — जैसे logging feature। इसे हर जगह copy-paste करना बुरा है। Trait इसे हल करता है: साझा methods एक बार define कीजिए, फिर use से किसी भी class में खींच लीजिए।
Trait define करना
<?php
trait Logger {
public function log($msg) {
return "LOG: " . $msg;
}
}
?>
Trait class जैसा दिखता है पर trait keyword इस्तेमाल करता है। इससे object नहीं बना सकते — यह सिर्फ़ असली classes में खींचे जाने को होता है।
Trait इस्तेमाल करना
<?php
class Order {
use Logger; // trait की methods खींचना
}
$o = new Order();
echo $o->log("Order placed");
?>
use Logger; line trait की log() method को Order में copy कर देती है, जैसे वो वहीं लिखी हो। कोई भी class यही कर सकती है, बिना inheritance।
कई traits जोड़ना
Class एक साथ कई traits खींच सकती है।
<?php
trait Logger { public function log($m){ return "LOG: $m"; } }
trait Timestamp { public function now(){ return "2026-01-01"; } }
class Report {
use Logger, Timestamp;
}
$r = new Report();
echo $r->log("done") . " at " . $r->now();
?>
यहीं traits चमकते हैं — आप कई स्रोतों से abilities मिलाते हैं, जो single inheritance नहीं कर सकती।
Trait बनाम interface
| बात | Trait | Interface |
|---|---|---|
| Code रखता है? | हाँ (असली methods) | नहीं (सिर्फ़ नाम) |
| उद्देश्य | Implementation साझा करना | Methods मौजूद होना लागू करना |
| Keyword | use | implements |
तैयार code साझा करने को trait; कुछ methods मौजूद होने की माँग को interface इस्तेमाल कीजिए। इन्हें अक्सर साथ इस्तेमाल किया जाता है।
आम गलतियाँ
- Trait को instantiate करने की कोशिश।
new Logger()नहीं कर सकते — traits classes के अंदर जाते हैं। - Method-नाम conflicts अनदेखा करना। एक जैसे method वाले दो traits को हल करने को
insteadof/asचाहिए। - Traits का ज़्यादा इस्तेमाल। बहुत सारी mixed-in methods class को समझना मुश्किल करती हैं — इन्हें सोच-समझकर इस्तेमाल कीजिए।
- Traits को interfaces समझना। Traits code रखते हैं; interfaces नहीं।
सारांश
- Trait दोबारा-इस्तेमाल-योग्य method code है जिसे
useसे classes में खींचते हैं। - यह साझा code के लिए PHP की single-inheritance सीमा हल करता है।
- Class एक साथ कई traits इस्तेमाल कर सकती है।
- Traits असली code रखते हैं; interfaces सिर्फ़ method नाम।
- एक-नाम method conflicts को
insteadof/asसे हल कीजिए।
आगे, method contracts लागू कीजिए abstract बनाम interface से, या classes दोहराइए PHP OOP में।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
PHP में trait क्या है?
use keyword से किसी भी class में खींच लीजिए। यह असंबंधित classes में code दोबारा इस्तेमाल करने का PHP का जवाब है।Inheritance होते हुए traits की ज़रूरत क्यों?
Trait और interface में क्या अंतर है?
क्या class एक से ज़्यादा trait इस्तेमाल कर सकती है?
use TraitA, TraitB;। उनकी सारी methods उस class में उपलब्ध हो जाती हैं, जो अलग abilities मिलाने का साफ़ तरीका है।अगर दो traits का method नाम एक हो तो क्या होता है?
insteadof और as keywords से इसे हल करने को कहती है ताकि आप चुनें या rename करें कि कौन-सा method रखना है। यह चुपचाप, confusing overrides रोकता है।