2016-04-05 15 views
5

का PHP ओवरराइड विशेषता विधि मैं लैरवेल 5.1 का उपयोग कर रहा हूं लेकिन यह उस ढांचे के लिए विशिष्ट नहीं है, यह एक सामान्य PHP प्रश्न है।PHP क्लास क्लास की विशेषता

namespace Illuminate\Foundation\Auth; 

use Illuminate\Auth\Authenticatable; 
use Illuminate\Database\Eloquent\Model; 
use Illuminate\Auth\Passwords\CanResetPassword; 
use Illuminate\Foundation\Auth\Access\Authorizable; 
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; 
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract; 
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; 

class User extends Model implements 
    AuthenticatableContract, 
    AuthorizableContract, 
    CanResetPasswordContract { 
    use Authenticatable, Authorizable, CanResetPassword; 
} 

तो मेरे पास है उपयोगकर्ता वर्ग मैं उस से विस्तार के साथ चिंतित हूँ:

namespace App\Api\V1\Models; 

use Illuminate\Foundation\Auth\User as Authenticatable; 
use Zizaco\Entrust\Traits\EntrustUserTrait; 

class User extends Authenticatable { 
    use EntrustUserTrait { 
    EntrustUserTrait::can insteadof \Illuminate\Foundation\Auth\Access\Authorizable; 
    } 
} 

EntrustUserTrait एक can() विधि का विरोध करता है

निर्दिष्ट लक्षण के साथ एक माता पिता के वर्ग नहीं है Authorizable विशेषता। हालांकि, Authorizable विशेषता मूल वर्ग पर है, इसलिए यह Required Trait wasn't added to App\Api\V1\Models\User त्रुटि उत्पन्न करता है।

मैंने चारों ओर खोज की है और बच्चे वर्ग में घोषित ओवरराइडिंग लक्षणों पर बहुत सारी जानकारी है, लेकिन मुझे मूल वर्ग से ओवरराइडिंग लक्षणों के बारे में कुछ भी नहीं मिल रहा है।

<?php  
trait AA { 
    function f() { 
     echo "I'm AA::f".PHP_EOL; 
    } 
} 
class A { 
    use AA; 
} 
trait BB { 
    function f() { 
     echo "I'm BB::f".PHP_EOL; 
    } 
} 
class B extends A { 
    use BB; 
} 
$b = new B();  
$b->f(); 

मैं बी बी :: च

मुझे विश्वास है कि लक्षण कॉपी-पेस्ट कोड की तरह काम करते हैं:

+0

आपको इसके बजाय बिल्कुल करने की आवश्यकता नहीं है। 'can' माता-पिता के 'can' को ओवरराइड कर देगा। – apokryfos

+0

इसके अलावा, यह विशेषता को लागू न करने के बारे में एक त्रुटि फेंकता है क्योंकि यह किसी अन्य विशेषता के साथ संघर्ष करता है। मुझे लगता है कि यह कुछ बढ़त मामला है, हालांकि, नीचे दिया गया उदाहरण काम करता है और अन्य विशेषता को ओवरराइड करता है। मुझे बिल्कुल यकीन नहीं है कि अंतर क्या है, हालांकि। – jdforsythe

उत्तर

5

निम्नलिखित कोड पर विचार करें। विशेषता कोड को उस वर्ग में "कॉपी-पेस्ट" कोड के रूप में माना जाता है जिसका उपयोग किया जाता है ताकि आप दिखा सकें कि विशेषता वास्तव में विरासत में नहीं है लेकिन यह कोड केवल मूल वर्ग का हिस्सा है।

+0

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

+0

यदि मामला है तो अलग-अलग विधि हस्ताक्षर वास्तव में विवाद पैदा करेंगे। – apokryfos

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