PHP: Ben Arabirimleri'nde alanlar kullanın miyim?

5 Cevap php

PHP, ben alanlara sahip bir arayüz belirtin ya da fonksiyonlarla sınırlı PHP arayüzleri olabilir?

<?php
interface IFoo
{
    public $field;
    public function DoSomething();
    public function DoSomethingElse();
}
?>

Eğer değilse, ben arabiriminde bir fonksiyonu olarak bir alıcı gösterebilirsiniz fark:

public GetField();

5 Cevap

Sen üyeleri belirtmek olamaz. Sen yaptığın gibi, alıcılar ve ayarlayıcıları sayesinde varlıklarını göstermek zorunda. Ancak, sabitler belirtebilirsiniz:

interface IFoo
{
    const foo = 'bar';    
    public function DoSomething();
}

Bkz http://www.php.net/manual/en/language.oop5.interfaces.php

Arayüzleri sadece yöntemleri desteklemek için tasarlanmıştır.

Arayüzler daha sonra diğer nesneler tarafından erişilebilir bir kamu API sağlamak için var olmasıdır.

Kamuya açık özellikleri gerçekten arabirimini uygulayan sınıfın içinde veri kapsüllenmesini ihlal eder.

Geç cevap, ancak işlevsellik burada istediğini almak için, size alanları içeren bir soyut sınıf düşünebilirsiniz. Soyut sınıfı bu gibi görünecektir:

abstract class Foo
{
    public $member;
}

Hala arayüze sahip olabilir iken:

interface IFoo
{
    public function someFunction();
}

Sonra böyle çocuğunuzun sınıf vardır:

class bar extends Foo implements IFoo
{
    public function __construct($memberValue = "")
    {
        // Set the value of the member from the abstract class
        $this->member = $memberValue;
    }

    public function someFunction()
    {
        // Echo the member from the abstract class
        echo $this->member;
    }
}

Meraklı ve hala isteyenler için alternatif bir çözüm yoktur. :)

Sadece yöntemler izin verilir (and make sense, as the goal of an interface is to specify an API): Bir interface içinde özelliklerini belirleyebilirsiniz olamaz


In PHP, trying to define properties in an interface should raise a Fatal Error : this portion of code :

interface A {
  public $test;
}

Size verecektir:

Fatal error: Interfaces may not include member variables in...

Alıcı ayarlayıcı kullanın. Ama bu pek çok sınıfa birçok alıcı ve ayarlayıcıları uygulamak için sıkıcı olabilir, ve bu sınıf kodunu yığılmayı. Ve you repeat yourself!

PHP 5.4 gibi traits, yani sınıflar için alanları ve yöntemleri sağlamak için kullanabilirsiniz:

interface IFoo
{
    public function DoSomething();
    public function DoSomethingElse();
    public function setField($value);
    public function getField();
}

trait WithField
{
    private $_field;
    public function setField($value)
    {
        $this->_field = $value;
    }
    public function getField()
    {
        return $this->field;
    }
}

class Bar implements IFoo
{
    use WithField;

    public function DoSomething()
    {
        echo $this->getField();
    }
    public function DoSomethingElse()
    {
        echo $this->setField('blah');
    }
}