PHP.mk документација

Интерфејси на објекти

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

language.oop5.interfaces.php PHP.net прокси Преводот е вчитан
Оригинал на PHP.net
Патека language.oop5.interfaces.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + преведен приказ Кодовите, табелите и белешките остануваат читливи во истиот тек.
Интерфејси на објекти

Референца за `language.oop5.interfaces.php` со подобрена типографија и навигација.

language.oop5.interfaces.php

Интерфејси на објекти

Интерфејсите на објектите ви овозможуваат да креирате код што специфицира кои методи и својства мора да ги имплементира една класа, без да мора да го дефинирате начинот на кој се имплементираат овие методи или својства. Интерфејсите споделуваат именски простор со класи, особини и броеви, така што тие не можат да го користат истото име.

Интерфејсите на објектите ви овозможуваат да креирате код што специфицира кои методи и својства мора да ги имплементира една класа, без да мора да се дефинира како се имплементираат тие методи или својства. Интерфејсите споделуваат именски простор со класи, особини и броеви, така што тие не можат да го користат истото име. interface Интерфејсите се дефинираат на ист начин како и класа, но со class клучниот збор што го заменува

клучниот збор и без ниту еден од методите да има дефинирана содржина.

Сите методи декларирани во интерфејс мора да бидат јавни; ова е природата на интерфејсот.

  • Во пракса, интерфејсите служат две комплементарни цели:
  • Да им овозможи на програмерите да создаваат објекти од различни класи што може да се користат заменливо бидејќи тие имплементираат ист интерфејс или интерфејси. Вообичаен пример се повеќе услуги за пристап до бази на податоци, повеќе портали за плаќање или различни стратегии за кеширање. Различни имплементации може да се заменат без да се бараат никакви промени во кодот што ги користи. Iterable, Cacheable, RenderableДа му овозможи на една функција или метод да прифати и работи со параметар што одговара на интерфејс, без да се грижи што друго може да направи објектот или како е имплементиран. Овие интерфејси често се именуваат како

, или така натаму за да се опише значењето на однесувањето. магични методи Интерфејсите може да дефинираат

Забелешка:

за да бараат од имплементирачките класи да ги имплементираат тие методи. constructors Иако се поддржани, вклучувањето на

implements

во интерфејсите е силно обесхрабрено. Правењето на тоа значително ја намалува флексибилноста на објектот што го имплементира интерфејсот. Дополнително, конструкторите не се наметнати од правилата за наследување, што може да предизвика недоследно и неочекувано однесување. implements За да се имплементира интерфејс, се користи операторот

Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

. Сите методи во интерфејсот мора да бидат имплементирани во класа; неуспехот да се направи тоа ќе резултира со фатална грешка. Класите може да имплементираат повеќе од еден интерфејс ако е пожелно со одвојување на секој интерфејс со запирка. именувани аргументиКласата што имплементира интерфејс може да користи различно име за своите параметри од интерфејсот. Сепак, од PHP 8.0 јазикот поддржува

Забелешка:

, што значи дека повикувачите може да се потпираат на името на параметарот во интерфејсот. Од таа причина, силно се препорачува програмерите да ги користат истите имиња на параметри како интерфејсот што се имплементира. extends operator.

Забелешка:

Интерфејсите може да се прошируваат како класи користејќи го Класата што го имплементира интерфејсот мора да ги декларира сите методи во интерфејсот со. Класата може да имплементира повеќе интерфејси кои декларираат метод со исто име. Во овој случај, имплементацијата мора да го следи правилата за компатибилност на потписот . Една класа може да имплементира повеќе интерфејси кои декларираат метод со исто име. Во овој случај, имплементацијата мора да следи по за сите интерфејси. Значи коваријанса и контраваријанса

Константи

може да се примени. константи во класаМожно е интерфејсите да имаат константи. Интерфејс константите работат исто како

Својства

. Пред PHP 8.1.0, тие не можеа да бидат препишани од класа/интерфејс што ги наследува.

Од PHP 8.4.0, интерфејсите исто така може да декларираат својства. Ако го сторат тоа, декларацијата мора да наведе дали својството треба да биде читливо, запишливо или и двете. Декларацијата на интерфејсот се однесува само на јавен пристап за читање и запишување. Една класа може да задоволи интерфејс својство на повеќе начини. Може да дефинира јавно својство. Може да дефинира јавно виртуелно својство readonly кое имплементира само соодветен кука. Или читливо својство може да биде задоволено од readonly.

својство. Сепак, својство на интерфејс што може да се постави не може да биде

<?php
interface I
{
// An implementing class MUST have a publicly-readable property,
// but whether or not it's publicly settable is unrestricted.
public string $readable { get; }

// An implementing class MUST have a publicly-writeable property,
// but whether or not it's publicly readable is unrestricted.
public string $writeable { set; }

// An implementing class MUST have a property that is both publicly
// readable and publicly writeable.
public string $both { get; set; }
}

// This class implements all three properties as traditional, un-hooked
// properties. That's entirely valid.
class C1 implements I
{
public
string $readable;

public
string $writeable;

public
string $both;
}

// This class implements all three properties using just the hooks
// that are requested. This is also entirely valid.
class C2 implements I
{
private
string $written = '';
private
string $all = '';

// Uses only a get hook to create a virtual property.
// This satisfies the "public get" requirement.
// It is not writeable, but that is not required by the interface.
public string $readable { get => strtoupper($this->writeable); }

// The interface only requires the property be settable,
// but also including get operations is entirely valid.
// This example creates a virtual property, which is fine.
public string $writeable {
get => $this->written;
set {
$this->written = $value;
}
}

// This property requires both read and write be possible,
// so we need to either implement both, or allow it to have
// the default behavior.
public string $both {
get => $this->all;
set {
$this->all = strtoupper($value);
}
}
}
?>

Примери

Пример #1 Пример за својства на интерфејс

<?php

// Declare the interface 'Template'
interface Template
{
public function
setVariable($name, $var);
public function
getHtml($template);
}

// Implement the interface
// This will work
class WorkingTemplate implements Template
{
private
$vars = [];

public function
setVariable($name, $var)
{
$this->vars[$name] = $var;
}

public function
getHtml($template)
{
foreach(
$this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}

return
$template;
}
}

// This will not work
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (Template::getHtml)
class BadTemplate implements Template
{
private
$vars = [];

public function
setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>

Пример #2 Пример за интерфејс

<?php
interface A
{
public function
foo();
}

interface
B extends A
{
public function
baz(Baz $baz);
}

// This will work
class C implements B
{
public function
foo()
{
}

public function
baz(Baz $baz)
{
}
}

// This will not work and result in a fatal error
class D implements B
{
public function
foo()
{
}

public function
baz(Foo $foo)
{
}
}
?>

Пример #3 Интерфејси што може да се прошират

<?php
class Foo {}
class
Bar extends Foo {}

interface
A {
public function
myfunc(Foo $arg): Foo;
}

interface
B {
public function
myfunc(Bar $arg): Bar;
}

class
MyClass implements A, B
{
public function
myfunc(Foo $arg): Bar
{
return new
Bar();
}
}
?>

Пример #4 Компатибилност на варијанса со повеќе интерфејси

<?php
interface A
{
public function
foo();
}

interface
B
{
public function
bar();
}

interface
C extends A, B
{
public function
baz();
}

class
D implements C
{
public function
foo()
{
}

public function
bar()
{
}

public function
baz()
{
}
}
?>

Пример #5 Наследување на повеќе интерфејси

<?php
interface A
{
const
B = 'Interface constant';
}

// Prints: Interface constant
echo A::B;


class
B implements A
{
const
B = 'Class constant';
}

// Prints: Class constant
// Prior to PHP 8.1.0, this will however not work because it was not
// allowed to override constants.
echo B::B;
?>

Пример #6 Интерфејси со константи

<?php
interface A
{
public function
foo(string $s): string;

public function
bar(int $i): int;
}

// An abstract class may implement only a portion of an interface.
// Classes that extend the abstract class must implement the rest.
abstract class B implements A
{
public function
foo(string $s): string
{
return
$s . PHP_EOL;
}
}

class
C extends B
{
public function
bar(int $i): int
{
return
$i * 2;
}
}
?>

Пример #7 Интерфејси со апстрактни класи

<?php

class One
{
/* ... */
}

interface
Usable
{
/* ... */
}

interface
Updatable
{
/* ... */
}

// The keyword order here is important. 'extends' must come first.
class Two extends One implements Usable, Updatable
{
/* ... */
}
?>

Пример #8 Проширување и имплементирање истовремено instanceof оператор и декларации на типови.

Белешки од корисници 4 белешки

thanhn2001 на gmail точка ком
пред 15 години
PHP prevents interface a contant to be overridden by a class/interface that DIRECTLY inherits it.  However, further inheritance allows it.  That means that interface constants are not final as mentioned in a previous comment.  Is this a bug or a feature?

<?php

interface a
{
    const b = 'Interface constant';
}

// Prints: Interface constant
echo a::b;

class b implements a
{
}

// This works!!!
class c extends b
{
    const b = 'Class constant';
}

echo c::b;
?>
vcnbianchi
пред 4 години
Just as all interface methods are public, all interface methods are abstract as well.
williebegoode на att точка нет
пред 11 години
In their book on Design Patterns, Erich Gamma and his associates (AKA: "The Gang of Four") use the term "interface" and "abstract class" interchangeably. In working with PHP and design patterns, the interface, while clearly a "contract" of what to include in an implementation is also a helpful guide for both re-use and making changes. As long as the implemented changes follow the interface (whether it is an interface or abstract class with abstract methods), large complex programs can be safely updated without having to re-code an entire program or module.

In PHP coding with object interfaces (as a keyword) and "interfaces" in the more general context of use that includes both object interfaces and abstract classes, the purpose of "loose binding" (loosely bound objects) for ease of change and re-use is a helpful way to think about both uses of the  term "interface." The focus shifts from "contractual" to "loose binding" for the purpose of cooperative development and re-use.
[email protected]
пред 5 години
This page says that if extending multiple interfaces with the same methods, the signature must be compatible. But this is not all there is to it: the order of `extends` matters. This is a known issue, and while it is disputable whether or not it is a bug, one should be aware of it, and code interfaces with this in mind.

https://bugs.php.net/bug.php?id=67270
https://bugs.php.net/bug.php?id=76361
https://bugs.php.net/bug.php?id=80785
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.