为什么这是不可能的:
$user = (User) $u[0];
但这是可能的
$bool = (boolean) $res['success'];
我使用 PHP 7.0。
您可以使用PHPDoc
/** @var User $user */
$user = $u[0];
据我所知,在PHP中,您只能将某些类型强制转换:
(int), (integer) - cast to integer
(bool), (boolean) - cast to boolean
(float), (double), (real) - cast to float (real deprecated in PHP 8.0)
(string) - cast to string
(binary) - cast to binary string (PHP 6)
(array) - cast to array
(object) - cast to object
(unset) - cast to NULL (PHP 5) (depracted in PHP 7.2) (removed in 8.0)
(请参见类型转换)
你也可以使用instanceof来检查特定类型:
if($yourvar instanceof YourClass) {
//DO something
} else {
throw new Exception('Var is not of type YourClass');
}
编辑
如Szabolcs Páll在他的回答中提到的那样,也可以声明一个返回类型或参数类型,但在这种情况下,如果类型不匹配,则会抛出一个异常(TypeError)。
function test(): string
{
return 'test';
}
function test(string $test){
return "test" . $test;
}
自 PHP 7.2 版本起,可以在类型前面添加 ? 来使其可为 null 值:function test(): ?string
{
return null;
}
function implicitFakeCast($myClass): YourClass
{
return $myClass;
}
注意:这实际上不会进行任何强制转换,而是在出现类别不匹配的情况下抛出异常,并让智能提示将其视为目标类的实例。$class = Derived::class; $instance = self::castAsBaseAbstract(new $class()); ... private static function castAsBaseAbstract($object): BaseAbstract{ return $object; }
。虽然这是一个很好的解决方案,但像@adir-kandel建议的那样使用phpDoc更容易。这里异常的概念并不重要。这完全是为了获得智能提示的好处。我的用例中,类类型存储在数组中,并在循环中创建实例。所有实例都派生自同一基类。 - TonyG对于那些想要将对象转换为类类型的人,我发现@borzilleri的gist使用serialize和unserialize可以实现这一点:https://gist.github.com/borzilleri/960035。
TL;DR:
// make sure to include the namespace when casting
$className = "Some\\NameSpace\\SomeClassName";
$classNameLength = strlen( $className );
$castedItem = unserialize(
preg_replace(
'/^O:\d+:"[^"]++"/',
"O:$classNameLength:\"$className\"",
serialize( $item )
)
)
在 PHP 8 中,这非常简单:
$item = (fn($item):YourClass=>$item)($item);
$item
是YourClass
的实例,则此代码不执行任何操作,否则它将抛出类型错误。 - miken32YourClass
,并且副作用是,IDE(phpstorm)将知道它...(而不需要任何丑陋的注释...)。 这几乎是由 @szabolcs-páll 提供的相同解决方案,但使用了 php8 的箭头函数,作为内联解决方案... - Gergely Laborci$item
的类型是object
,那么这将导致TypeError。它不会转换或改变对象的类型。 - undefined对象和基本类型是不同的。由于被称为基本类型,它们非常简单,可能只有1字节、2字节或4字节,最多8字节。
当我们谈论对象时,这个对象可以与其他对象具有不同的属性。PHP的问题就是“这个对象真的来自我的类吗?”“如何将这个对象转换为我的类?”因此,您不能立即使用解析对象。
$myObject = (ClassName) $variable
那么如何进行投射呢?不太清楚,但通常的方法是这样的:
下面是示例:
public class MyAwesomeClass{
function __construct($thisIsArray){
$this->attributeA = $thisIsArray["A"];
$this->attributeB = $thisIsArray["B"];
......
}
static function fromArray($thisIsArray){
return MyAwesomeClass($thisIsArray);
}
}
$obj = MyAwesomeClass::fromArray($attributes);
$obj = MyAwesomeClass::fromArray($attributes);
。 - MohannadNaj$user = User::buildFromSomeArrayInput($u[0]);
instanceof
来检查对象的类。 - Raptor$u[0]
是什么? - A.L