Hướng dẫn can php interface have variables? - giao diện php có biến không?

Trong PHP, tôi có thể chỉ định giao diện để có các trường hoặc giao diện PHP bị giới hạn trong các chức năng không?


Nếu không, tôi nhận ra rằng tôi có thể phơi bày một getter như một chức năng trong giao diện:

public GetField();

hỏi ngày 12 tháng 2 năm 2010 lúc 11:52Feb 12, 2010 at 11:52

Hướng dẫn can php interface have variables? - giao diện php có biến không?

Bác sĩ Bluedoctor BlueDoctor Blue

3.6276 Huy hiệu vàng38 Huy hiệu bạc60 Huy hiệu Đồng6 gold badges38 silver badges60 bronze badges

2

Bạn không thể chỉ định các thành viên. Bạn phải chỉ ra sự hiện diện của họ thông qua getters và setters, giống như bạn đã làm. Tuy nhiên, bạn có thể chỉ định các hằng số:

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

Xem http://www.php.net/manual/en/language.oop5.Interfaces.php

Đã trả lời ngày 12 tháng 2 năm 2010 lúc 12:03Feb 12, 2010 at 12:03

Hướng dẫn can php interface have variables? - giao diện php có biến không?

Câu trả lời muộn, nhưng để có được chức năng muốn ở đây, bạn có thể muốn xem xét một lớp trừu tượng có chứa các trường của bạn. Lớp trừu tượng sẽ trông như thế này:

abstract class Foo
{
    public $member;
}

Trong khi bạn vẫn có thể có giao diện:

interface IFoo
{
    public function someFunction();
}

Sau đó, bạn có lớp con của bạn như thế này:

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

Có một giải pháp thay thế cho những người vẫn còn tò mò và quan tâm. :)

Đã trả lời ngày 11 tháng 5 năm 2013 lúc 3:48May 11, 2013 at 3:48

WIMP_noWIMP_noWIMP_no

5095 Huy hiệu bạc7 Huy hiệu đồng5 silver badges7 bronze badges

4

Sử dụng Getter Setter. Nhưng điều này có thể tẻ nhạt để thực hiện nhiều getters và setters trong nhiều lớp, và nó lộn xộn mã lớp. Và bạn lặp lại chính mình!

Kể từ Php 5.4, bạn có thể sử dụng các đặc điểm để cung cấp các trường và phương thức cho các lớp, tức là:

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

Điều này đặc biệt hữu ích nếu bạn phải kế thừa từ một số lớp cơ sở và cần thực hiện một số giao diện.

class CooCoo extends Bird implements IFoo
{
    use WithField;

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

Đã trả lời ngày 18 tháng 4 năm 2014 lúc 14:01Apr 18, 2014 at 14:01

1

Giao diện chỉ được thiết kế để hỗ trợ các phương thức.

Điều này là do các giao diện tồn tại để cung cấp API công khai mà sau đó có thể được truy cập bởi các đối tượng khác.

Các thuộc tính có thể truy cập công khai thực sự sẽ vi phạm đóng gói dữ liệu trong lớp thực hiện giao diện.

Đã trả lời ngày 12 tháng 2 năm 2010 lúc 11:54Feb 12, 2010 at 11:54

Nô -ê Goodrichnoah GoodrichNoah Goodrich

24.5K13 Huy hiệu vàng65 Huy hiệu bạc95 Huy hiệu Đồng13 gold badges65 silver badges95 bronze badges

Bạn không thể chỉ định các thuộc tính trong

public GetField();
0: Chỉ được phép các phương thức (và có ý nghĩa, vì mục tiêu của giao diện là chỉ định API)


Trong PHP, cố gắng xác định các thuộc tính trong giao diện sẽ gây ra lỗi nghiêm trọng: phần mã này:

interface A {
  public $test;
}

Sẽ cho bạn:

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

Đã trả lời ngày 12 tháng 2 năm 2010 lúc 11:56Feb 12, 2010 at 11:56

Pascal Martinpascal MartinPascal MARTIN

389K77 Huy hiệu vàng647 Huy hiệu bạc656 Huy hiệu Đồng77 gold badges647 silver badges656 bronze badges

Giao diện có thể chứa các biến?

Giống như một lớp, một giao diện có thể có các phương thức và biến, nhưng các phương thức được khai báo trong một giao diện là theo mặc định trừu tượng (chỉ chữ ký phương thức, không có cơ thể).an interface can have methods and variables, but the methods declared in an interface are by default abstract (only method signature, no body).

Giao diện PHP có thể có thuộc tính không?

Giao diện không thể có thuộc tính, trong khi các lớp trừu tượng có thể.Tất cả các phương thức giao diện phải được công khai, trong khi các phương thức lớp trừu tượng được công khai hoặc được bảo vệ.Tất cả các phương thức trong một giao diện là trừu tượng, vì vậy chúng không thể được thực hiện trong mã và từ khóa trừu tượng là không cần thiết., while abstract classes can. All interface methods must be public, while abstract class methods is public or protected. All methods in an interface are abstract, so they cannot be implemented in code and the abstract keyword is not necessary.

Giao diện có thể có hằng số trong PHP không?

Giao diện có thể chứa các phương thức và/hoặc hằng số, nhưng không có thuộc tính., but no attributes.

Điểm giao diện trong PHP là gì?

Giao diện cho phép người dùng tạo các chương trình chỉ định các phương thức công khai mà một lớp phải thực hiện, mà không liên quan đến sự phức tạp và chi tiết về cách thực hiện các phương thức cụ thể.allows users to create programs specifying the public methods that a class must implement, without involving the complexities and details of how the particular methods are implemented.