2016-04-05 22 views
5

Laravel 5.1 kullanıyorum, ancak bu çerçeveye özgü değil, genel bir PHP sorusu. SonraPHP, ebeveyn sınıfının özelliğinin özellik yöntemini geçersiz kılar.

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; 
} 

Ben bunu uzanan ilgileniyorum Kullanıcı sınıfı:

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 ile çakışan bir can() yöntemi vardır

belirtilen özelliklere sahip bir üst sınıf var Authorizable özelliğidir. Ancak, Authorizable özelliğinin üst sınıfında olması, bu nedenle Required Trait wasn't added to App\Api\V1\Models\User numaralı hataya neden olur.

Çevremde arama yaptım ve çocuk sınıfında bildirilen geçersiz özelliklerle ilgili pek çok bilgi var, ancak üst sınıftaki özelliklerin geçersiz kılınmasıyla ilgili hiçbir şey bulamıyorum.

<?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(); 

Ben BB :: Ben özellikleri kopyala-yapıştır kodu gibi çalışmak inanıyoruz

f:

+0

Bunun yerine yapmak zorunda değilsiniz. 'ebeveyni' yapamaz 'can'. – apokryfos

+0

dışında, başka bir özellik ile çakıştığından, özelliği uygulama konusunda bir hata atar. Bu, aşağıdaki örnekte olduğu gibi, diğer örnekte işe yarayacak ve diğer özelliği geçersiz kıldığını düşünüyorum. Yine de farkın ne olduğundan emin değilim. – jdforsythe

cevap

5

Aşağıdaki kodu düşünün. Özellik kodu, kullanılan sınıfta "kopyala yapıştırılmış" bir kod gibi ele alınır; böylece, özelliğin gerçekten miras almadığını, ancak kodun yalnızca ana sınıfın bir parçası olduğunu varsayabilirsiniz.

+0

Gerçekten de örnek çalışmanız. Belki de bu durumla benim durumum arasındaki fark, ana sınıfın yöntemi uygulamak için bir arabirim oluşturmasıdır. Ya da belki de bu arayüz farklı bir fonksiyon imzasını tanımlamaktadır? Emin değilim. Ama sadece ebeveynleri genişletmek yerine ayrı bir sınıf oluşturmaya karar verdim, çünkü yaptığı tek şey sözleşmeleri uygulamak ve özellikleri eklemek. – jdforsythe

+0

Farklı yöntem imzaları gerçekten de bu durumda çakışmalara neden olur. – apokryfos

İlgili konular