Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.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 使用返回类型声明返回NULL_Php_Php 7_Type Hinting_Php 7.1 - Fatal编程技术网

Php 使用返回类型声明返回NULL

Php 使用返回类型声明返回NULL,php,php-7,type-hinting,php-7.1,Php,Php 7,Type Hinting,Php 7.1,当我遇到问题时,我正在重构用于PHP7的代码库,特别是实现标量类型提示和返回类型提示 我有一个具有一些属性的类,其中一个属性有一个id。这个id不是必需的(您可以在不设置id的情况下构造一个对象)。当创建此类的新对象时,您不设置id,并且在将其插入db(由单独的映射器类)后,它会立即获得一个id 此映射器类需要检查对象是否已存在于数据库中,并通过检查id是否已设置来执行此操作: if(empty($exampleObject->getId())) { // Insert objec

当我遇到问题时,我正在重构用于PHP7的代码库,特别是实现标量类型提示和返回类型提示

我有一个具有一些属性的类,其中一个属性有一个id。这个id不是必需的(您可以在不设置id的情况下构造一个对象)。当创建此类的新对象时,您不设置id,并且在将其插入db(由单独的映射器类)后,它会立即获得一个id

此映射器类需要检查对象是否已存在于数据库中,并通过检查id是否已设置来执行此操作:

if(empty($exampleObject->getId())) {
    // Insert object
} else {
    // Update object
}
我对代码库中的每个函数都应用了返回类型提示,问题是如果强制使用int返回类型,函数
getId()
不能返回NULL。即使没有启用严格的键入,它也会键入错误:

致命错误:未捕获的TypeError:ExampleClass::getId()的返回值必须是integer类型,返回null

我曾考虑过不为这个getter设置返回类型提示,但后来我意识到问题可能不是返回类型提示,而是我使用的是混合返回类型。我记得在某个地方读到过使用混合返回类型是一件坏事,但我不知道如何在不使用混合返回类型的情况下解决这个问题。我可以:

  • 在getter中抛出异常,并在mapper类中设计检查,以便它捕获该异常
  • 捕获TypeError异常,并使用该异常指示未设置id
  • 公开id属性,这样我就可以直接调用isset
  • 添加一个不同的方法
    hasId()返回isset($this->id)
坦白地说,我并不喜欢这些解决方案,我想知道是否有更好的选择。对于这种情况,最好的做法是什么


另外,如果启用了严格的键入,我不应该只得到一个TypeError吗?我认为PHP7默认为“弱类型提示”。

使用
null
意味着使用面向对象的方法,因为值类型不能为null。所以在整数类型周围使用类包装器可能很有用。例如,从SPL类型中。

PHP7.1添加了一个问号,在类型名称之前添加一个问号,将返回类型标记为同时接受该类型和null:

public function getId(): ?int {
    /* … */
}

如果您仍然使用PHP7.0,我建议省略类型声明并使用docblock。

尝试
int?
作为返回-type@tkausl这是否得到实施?我不知道这个特性(它不在PHP文档中),但我发现了(可空类型)。这就是你指的吗?如果是这样,这是一个针对PHP7.1.Oh的草案。。我肯定在什么地方见过,但不确定在哪里,对不起。@tkausl,这是C#syntaxis!re:只在严格的键入模式下获取
TypeError
s,这不是它的工作原理。默认情况下,PHP将尝试在类型之间强制,但如果不可能,它将抛出
TypeError
,至少对于用PHP编写的用户函数是如此。但是,除非处于严格模式,否则内置/扩展函数不会抛出
TypeError
。谢谢。这就意味着返回NULL本身并没有错?是的,虽然有一些参数可以避免
NULL
,但它们并不普遍适用。除此之外,我想指出的是PSR2为类指定了一个开括号&方法在新行;)@我是一个逆向投资者:p