Gerçekten kısa versiyon daha basit çünkü yapamazsınız. Özellikler böyle çalışmaz.
Eğer yazarken use SomeTrait;
PHP'de bunu kullanılmakta olduğu sınıfa Süreklik kodu kopyalayıp yapıştırmak için derleyici söylüyorum (etkili) bulunmaktadır.
Çünkü use SomeTrait;
sınıf içinde, bu ekleyemezsiniz implements SomeInterface
o sınıfta dışında olmak zorunda, çünkü sınıfa.
"PHP'de neden Özellik türleri yok?"
Çünkü somutlaştırılamazlar. Özellikler, kodunuz tarafından referans alınabilecek bir nesne veya türün aksine , gerçekten sadece bir dil yapısıdır (derleyiciye özellik kodunu kopyalayıp bu sınıfa yapıştırmasını söyler).
Bu yüzden, özelliğimi kullanmak isteyen her sınıfın arabirimi uygulaması gerektiğini kodda "tasarlamak" istiyorum.
Bu use
, özelliğe soyut bir sınıf kullanılarak ve ardından ondan sınıfları genişletilerek zorlanabilir .
interface SomeInterface{
public function someInterfaceFunction();
}
trait SomeTrait {
function sayHello(){
echo "Hello my secret is ".static::$secret;
}
}
abstract class AbstractClass implements SomeInterface{
use SomeTrait;
}
class TestClass extends AbstractClass {
static public $secret = 12345;
}
$test = new TestClass();
$test->sayHello();
Bununla birlikte - bir Özellik kullanan herhangi bir sınıfın belirli bir yöntemi olduğunu zorlamanız gerekiyorsa, bence ilk etapta soyut sınıflar olmanız gereken özellikleri kullanıyor olabilirsiniz.
Ya da mantığınızın yanlış olduğunu. Arabirimleri uygulayan sınıfların belirli işlevlere sahip olmasını istemeniz gerekir, belirli işlevlere sahipse kendilerini bir arabirim uyguluyor olarak bildirmeleri gerekmez.
Düzenle
Aslında, bir sınıfı yöntemi uygulamaya zorlamak için Traits içinde soyut işlevler tanımlayabilirsiniz. Örneğin
trait LoggerTrait {
public function debug($message, array $context = array()) {
$this->log('debug', $message, $context);
}
abstract public function log($level, $message, array $context = array());
}
Bununla birlikte, bu yine de arayüzü özellikte uygulamanıza izin vermez ve yine de kötü bir tasarım gibi kokar, çünkü arayüzler bir sınıfın yerine getirmesi gereken bir sözleşmeyi tanımlamada özelliklerden çok daha iyidir.