为啥 PHP 的类型提示认为我的类是字符串?

Posted

技术标签:

【中文标题】为啥 PHP 的类型提示认为我的类是字符串?【英文标题】:Why Does PHP's Type Hinting Think My Class is a String?为什么 PHP 的类型提示认为我的类是字符串? 【发布时间】:2011-11-08 23:37:17 【问题描述】:

我正在编写我编写的 php 类。它的setColour() 方法类型提示我的另一个类的实例,Colour

我正在这样做:

$colour = new Colour($updates->colour);
echo get_class($colour);
$product->setColour($colour);

正如我所料,get_class 告诉我$colourdomain\Colour 的一个实例,但是当我将它传递给setColour() 时出现错误:

可捕获的致命错误:传递给 domain\Product::setColour() 的参数 1 必须是 domain\Colour 的实例,给定字符串,...

Colour 看起来像这样:

<?php
namespace base\domain;

/**
 * Represents a colour.
 *
 **/
class Colour extends \base\domain\Enum 
const __default = self::NONE;

const NONE = NULL;
const BLACK = 'black';
const BLUE = 'blue';
const BRONZE = 'bronze';
const BROWN = 'brown';
const GOLD = 'gold';
const GREEN = 'green';
const GREY = 'grey';
const MULTICOLOURED = 'multicoloured';
const ORANGE = 'orange';
const PINK = 'pink';
const PURPLE = 'purple';
const RED = 'red';
const SILVER = 'silver';
const WHITE = 'white';
const YELLOW = 'yellow';

 // END class Colour

Colour 扩展了一个自定义的Enum 类型,它覆盖了__toString(),所以我认为这可能会导致问题,但是当我删除__toString() 实现时没有帮助。

您能提供的任何想法将不胜感激。

【问题讨论】:

很奇怪。你在文字代码上面显示的是什么? 如果你这样做会发生什么$product-&gt;setColour(new Colour($updates-&gt;colour)); ?? 发布有问题的课程,这样会更容易帮助你 这对我来说很好,没有收到警告。 (sn-p:pastebin.com/uh7DrFJE)。你用的是哪个版本? 你能展示一下Colour 类的样子吗? 【参考方案1】:

我做个测试,没发现问题:

<?php

class Colour 

    private $name;

    public function __toString() 
        return $this->name;
    

    public function __construct($name) 
        $this->name = $name;
    



class Product 

    public $colour;

    public function setColour(Colour $c) 
        $this->colour = $c;
    



error_reporting(E_ALL);
$product = new Product();
$colour = new Colour('red');
echo get_class($colour).' ';
$product->setColour($colour);
echo $product->colour;

【讨论】:

谢谢@pinouchon。你完全正确,没有任何问题!

以上是关于为啥 PHP 的类型提示认为我的类是字符串?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PHP 中需要类型提示?

为啥 GDB 认为我的 Fortran 字符串是 ~4GiB

简述C#中类型转换的方式

C++中cout<<字符数组名;为啥能输出字符串?

为啥编译器认为这个类是抽象的(C++)?

php中单引号和双引号的区别,哪个速度更快?为啥?