Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用接口_Php - Fatal编程技术网

在PHP中使用接口

在PHP中使用接口,php,Php,我来自C#,我正在努力找到让代码可扩展的PHP方法 比如说,我有一个函数,可以计算我推荐的每日食物摄入量。它关注维生素、卡路里、矿物质等 我想在我的应用程序中使用许多不同的食物对象,以及查看食物不同方面的不同函数,因此我实现了一个IFoodNutrition接口,并使我希望与函数兼容的食物类实现它。然后我声明我的函数将其作为参数 function GetRda(IFoodNutrition $food){} 在C#中,我将指定我需要在接口中使用的所有属性,因此我知道任何实现此功能的类都将与此函

我来自C#,我正在努力找到让代码可扩展的PHP方法

比如说,我有一个函数,可以计算我推荐的每日食物摄入量。它关注维生素、卡路里、矿物质等

我想在我的应用程序中使用许多不同的食物对象,以及查看食物不同方面的不同函数,因此我实现了一个
IFoodNutrition
接口,并使我希望与函数兼容的食物类实现它。然后我声明我的函数将其作为参数

function GetRda(IFoodNutrition $food){}
在C#中,我将指定我需要在接口中使用的所有属性,因此我知道任何实现此功能的类都将与此函数兼容

让我头疼的是PHP只允许在接口中使用方法签名

我的问题显然是范式的转变。我不确定PHP中的等效模式是什么。我已经阅读了文档,我看不到类似的替代方案,除非您从抽象类继承,但是您只能从一个类继承,所以这不是同样的工作方式

因为PHP不是类型安全的,所以我不必创建接口。有人可以将任何对象发送到该方法,如果该方法具有正确格式所需的属性,则该方法将正常工作。不过,这对我来说似乎并不合适,因为我已经习惯于在接口中说明应该如何与事物进行交互

<> P>我感觉应该至少在对象验证的中间有一些额外的步骤和一个开发者可以查看的明显结构,然后直观地实现他们自己的类,并且在运行前看到错误。 PHP中有这样一种特定的模式吗

PHP只允许在接口中使用方法签名

这是真的。但是,没有什么可以阻止您将属性的传统getter和setter作为接口的一部分。这样做会抽象底层的实现细节

有人可以将任何对象发送到该方法,如果该方法具有正确格式所需的属性,则该方法将正常工作


事实并非如此。您的论点是
IFoodNutrition$food
。如果此函数接收到一个未实现
IFoodNutrition
接口的对象,PHP将抛出一个致命错误。

我的PHP知识仍然有限,但我将尝试一些关于如何解决此问题的答案

1.又快又脏(不推荐,imho,big no) 接受输入上的所有内容,如果输入无效,则失败并出现异常

function getRda ($food) { if (!($food instanceof IInterface)) { throw new \Exception('function argument should be instance of IInterface'); } //... do your magic }
然后,在每个需要多重继承的类中(相当于扩展两个抽象类),使用上面的特性

在php中不能在接口中定义属性


这是有意义的,因为接口的功能是指定API,而不是实现。

PHP(从5.1版开始)允许,而不仅仅是接口。在那里,但它被撤回了。目前,在PHP中没有确保类型安全的安全方法。为参数记录接受的类型,如果可能,使用类型提示,检查函数是否获得了预期的类型并相应地引发异常。在无效类型上引发错误不会使语言类型安全。7将大大有助于实现这一目标,但仍然不是类型安全的。为此,您需要在转换等方面有更多的可预测性@ircmaxell,您让我了解了关于类型安全的语义。不过,关于这个问题,有人可以将任何对象发送到该方法,如果该方法具有正确格式所需的属性,那么它就可以工作。当然,这就是为什么我没有投反对票或写我自己的答案。你说的是对的,只是语义细节有点不对劲,因此我试图在评论中解释学究式的观点-d接口将是空的,因为它无法定义属性,因此类实现它的事实将使它与方法不兼容,因此除了阻止意外传递之外,没有任何实际用途。我必须验证方法内部的输入,并在phpdoc中为开发人员留下指令。接口作为一个契约,所有实现对象都受到约束。您的方法可以可靠地调用接口中定义的任何方法。让您的代码调用getter,而不是直接访问属性。瞧,你能在traits中使用属性吗?很抱歉,提到traits,使用函数getRda(IInterface$food)+有什么不对。但是,此时不能键入提示特征。所以你会失去这个功能。@BradleyWeston nothing。一切都好。但人们应该保持选择余地,因为应该有其他方法来解决需求。具有替代或补充解决方案。
trait Food 
{
   protected $minerals;
   public function getMinerals ()
     {
        return $this->minerals;
     }
}