PHP投射到我的班级

时间:2017-03-06 10:42:56

标签: php casting

为什么这是不可能的:

$user = (User) $u[0];

但这是可能的

$bool = (boolean) $res['success'];

我使用PHP 7.0。

8 个答案:

答案 0 :(得分:7)

据我所知,在PHP中你只能转换为某些类型:

(int), (integer) - cast to integer
(bool), (boolean) - cast to boolean
(float), (double), (real) - cast to float
(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)

(见Type Casting

相反,您可以使用instanceof检查特定类型:

if($yourvar instanceof YourClass) {
    //DO something
} else {
    throw new Exception('Var is not of type YourClass');
}

答案 1 :(得分:4)

您可以使用 PHPDoc

/** @var User $user */
$user = $u[0];

答案 2 :(得分:1)

除了为什么不可能这样做的答案之外,我建议您根据输入编写一个创建对象的构建器函数。所以它看起来像

$user = User::buildFromSomeArrayInput($u[0]);

然后让一个构建器创建一个新的User对象,分配正确的属性等等。当然,你可以就地完成所有这些,但是有一个构建器功能可以确保你赢了#t在多个位置执行此操作,您可以设置私有属性,因为它是类成员函数。有一点工作,然后神奇地工作,但不是那么多。 您可能遇到的唯一问题是当您有一个不会暴露您可能需要的所有内部的不同对象时。但这是有原因的,因为内部可能会改变 - >你不想依赖它。

有些黑客建议用序列化来做这件事。我建议远离他们,因为他们是黑客,就我而言,不是很清楚。

答案 3 :(得分:1)

如果只想确保变量是YourClass的实例,并允许对类型系统进行异常处理,则可以使用以下函数:

function implicitFakeCast($myClass): YourClass
{
    return $myClass;
}

注意:这实际上不会进行任何强制转换,而是在类不匹配的情况下引发异常,并让intellisense将其视为目标类的实例。

答案 4 :(得分:0)

对象和原始类型是不同的。由于它被称为基本类型,它们非常简单,可能只有1个字节,2个字节或4个字节,最多8个字节。

当我们谈论对象时,此对象可以与其他对象具有不同的属性。然后来自PHP的问题是,"这个对象真的来自我的班级吗?" "如何将此对象转换为我的类?"。因此,您无法使用

立即解析对象
$myObject = (ClassName) $variable

那怎么投呢? Dunno,但通常方法是这样的:

  1. 为类创建构造函数
  2. 在课堂上,制作一个专门接受某些参数的方法,可能是数组
  3. 这里是样本:

    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);
    

答案 5 :(得分:0)

PHP支持两种类型的转换。

  1. 隐式投射
  2. 显式投射

隐式转换由PHP完成。例如,当将两个整数(5/2)相除时,结果将是浮点数(2.5)。此转换由PHP完成。

显式转换可以由我们(程序员)完成。就像您的问题一样,您可以使用()强制转换为新的数据类型。但是,一切都不以这种方式工作。有时,这可能会导致数据丢失(将浮点数(2.52)强制转换为整数将删除十进制值,这很有用)。投射到对象可能会有风险,因为不同的对象以不同的方式表现。

Learn More about Type Casting

因此,如果您要转换为对象,请使用对象构造函数。

gradle.properties

用户类应该是这样的。

$user = new User($u[0]);

通过这种方式,您可以创建自己的对象来处理与用户相关的数据等等。

答案 6 :(得分:0)

对于确实希望能够转换为类类型的人。我发现@borzilleri的要旨是使用序列化和反序列化来实现这一目标: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 )
    )
)

答案 7 :(得分:-1)

原因是“false”是一个字符串而且是真的。但是false是一个布尔值。

$res['success'] = "false"|;
if ($res['success']) { // returns true
    // this cose will be executed
}

此处的另一个示例:echo "false" == true ? 111 : 222;打印111。

再次,......“42”是一个字符串,而42是一个数字。

您始终可以检查变量内容的布尔值。

“PHP在变量声明中不需要(或支持)显式类型定义;变量的类型由使用变量的上下文决定。也就是说,如果将字符串值赋给变量$ var, $ var成为一个字符串。如果一个整数值被赋值给$ var,它就变成一个整数。“

文档中的另一个例子:

<?php
$foo = 10;   // $foo is an integer
$bar = (boolean) $foo;   // $bar is a boolean
?>

看看the type comparison tables