php 8.1 - return 类型在旧脚本中已弃用
php 8.1 - return type deprecated in older script
尝试更新到 php 8.1 并注意到错误日志中出现了这个已弃用的通知,我想处理一下。
[14-Feb-2022 14:48:25 UTC] PHP Deprecated: Return type of TLDExtractResult::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/example/public_html/assets/tldextract/tldextract.php on line 299
我能够抑制警告,但实际上我想更新脚本以便将来不会出现问题。
//public function offsetExists($offset) {
// return array_key_exists($offset, $this->fields);
//}
#[\ReturnTypeWillChange]
public function offsetExists(mixed $offset) {
return array_key_exists($offset, $this->fields);
}
这是有问题的代码部分:
class TLDExtractResult implements ArrayAccess {
private $fields;
public function __construct($subdomain, $domain, $tld) {
$this->fields = array(
'subdomain' => $subdomain,
'domain' => $domain,
'tld' => $tld,
);
}
public function __get($name) {
if ( array_key_exists($name, $this->fields) ) {
return $this->fields[$name];
}
throw new OutOfRangeException(sprintf('Unknown field "%s"', $name));
}
public function __isset($name) {
return array_key_exists($name, $this->fields);
}
public function __set($name, $value) {
throw new LogicException('Can\'t modify an immutable object.');
}
public function __toString() {
return sprintf('%s(subdomain=\'%s\', domain=\'%s\', tld=\'%s\')', __CLASS__, $this->subdomain, $this->domain, $this->tld);
}
//public function offsetExists($offset) {
// return array_key_exists($offset, $this->fields);
//}
#[\ReturnTypeWillChange]
public function offsetExists(mixed $offset) {
return array_key_exists($offset, $this->fields);
}
//public function offsetGet($offset) {
// return $this->__get($offset);
//}
#[\ReturnTypeWillChange]
public function offsetGet(mixed $offset) {
return $this->__get($offset);
}
//public function offsetSet($offset, $value) {
// throw new LogicException(sprintf('Can\'t modify an immutable object. You tried to set "%s".', $offset));
//}
#[\ReturnTypeWillChange]
public function offsetSet(mixed $offset, $value) {
throw new LogicException(sprintf('Can\'t modify an immutable object. You tried to set "%s".', $offset));
}
//public function offsetUnset($offset) {
// throw new LogicException(sprintf('Can\'t modify an immutable object. You tried to unset "%s".', $offset));
//}
#[\ReturnTypeWillChange]
public function offsetUnset(mixed $offset) {
throw new LogicException(sprintf('Can\'t modify an immutable object. You tried to unset "%s".', $offset));
}
/**
* Get the domain name components as a native PHP array.
* The returned array will contain these keys: 'subdomain', 'domain' and 'tld'.
*
* @return array
*/
public function toArray() {
return $this->fields;
}
}
php 8.1 到底有什么不一样的地方?这比我通常对 php 所做的稍高一点,我不确定这个问题。听起来需要指定特定的 return 类型?
是的,您可以指定 return 类型,这些类型与 ArrayAccess
接口的各种方法所指示的类型相匹配,如 in the manual 所示。例如,对于您问题中弃用消息中的特定方法,就像这样:
public function offsetExists(mixed $offset): bool {
return array_key_exists($offset, $this->fields);
}
尝试更新到 php 8.1 并注意到错误日志中出现了这个已弃用的通知,我想处理一下。
[14-Feb-2022 14:48:25 UTC] PHP Deprecated: Return type of TLDExtractResult::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/example/public_html/assets/tldextract/tldextract.php on line 299
我能够抑制警告,但实际上我想更新脚本以便将来不会出现问题。
//public function offsetExists($offset) {
// return array_key_exists($offset, $this->fields);
//}
#[\ReturnTypeWillChange]
public function offsetExists(mixed $offset) {
return array_key_exists($offset, $this->fields);
}
这是有问题的代码部分:
class TLDExtractResult implements ArrayAccess {
private $fields;
public function __construct($subdomain, $domain, $tld) {
$this->fields = array(
'subdomain' => $subdomain,
'domain' => $domain,
'tld' => $tld,
);
}
public function __get($name) {
if ( array_key_exists($name, $this->fields) ) {
return $this->fields[$name];
}
throw new OutOfRangeException(sprintf('Unknown field "%s"', $name));
}
public function __isset($name) {
return array_key_exists($name, $this->fields);
}
public function __set($name, $value) {
throw new LogicException('Can\'t modify an immutable object.');
}
public function __toString() {
return sprintf('%s(subdomain=\'%s\', domain=\'%s\', tld=\'%s\')', __CLASS__, $this->subdomain, $this->domain, $this->tld);
}
//public function offsetExists($offset) {
// return array_key_exists($offset, $this->fields);
//}
#[\ReturnTypeWillChange]
public function offsetExists(mixed $offset) {
return array_key_exists($offset, $this->fields);
}
//public function offsetGet($offset) {
// return $this->__get($offset);
//}
#[\ReturnTypeWillChange]
public function offsetGet(mixed $offset) {
return $this->__get($offset);
}
//public function offsetSet($offset, $value) {
// throw new LogicException(sprintf('Can\'t modify an immutable object. You tried to set "%s".', $offset));
//}
#[\ReturnTypeWillChange]
public function offsetSet(mixed $offset, $value) {
throw new LogicException(sprintf('Can\'t modify an immutable object. You tried to set "%s".', $offset));
}
//public function offsetUnset($offset) {
// throw new LogicException(sprintf('Can\'t modify an immutable object. You tried to unset "%s".', $offset));
//}
#[\ReturnTypeWillChange]
public function offsetUnset(mixed $offset) {
throw new LogicException(sprintf('Can\'t modify an immutable object. You tried to unset "%s".', $offset));
}
/**
* Get the domain name components as a native PHP array.
* The returned array will contain these keys: 'subdomain', 'domain' and 'tld'.
*
* @return array
*/
public function toArray() {
return $this->fields;
}
}
php 8.1 到底有什么不一样的地方?这比我通常对 php 所做的稍高一点,我不确定这个问题。听起来需要指定特定的 return 类型?
是的,您可以指定 return 类型,这些类型与 ArrayAccess
接口的各种方法所指示的类型相匹配,如 in the manual 所示。例如,对于您问题中弃用消息中的特定方法,就像这样:
public function offsetExists(mixed $offset): bool {
return array_key_exists($offset, $this->fields);
}