PHP instanceof和抽象类

时间:2016-09-08 16:04:06

标签: php abstract-class instanceof

我有一个这样的抽象类:

<?php 
abstract class NoCie {
    const SC = 01;
    const MTL = 02;
    const LAV = 03;
}
?>

我想测试变量$ x是否仅包含此抽象类的值。

现在我使用 $ x instanceof NoCie ,但这可能不起作用,因为这个类是抽象的,无法实例化。

以下是我尝试用来验证的代码。

class CustomersTaxes
{

    public $NoCie;
    private $_file;

    public function __construct($file)
    {
        $this->_file = $file;
    }

    public function CheckValidAndWrite()
    {
        $error = false;

        //Numéro de compagnie
        if (!($this->NoCie instanceof NoCie)) {
            $error = true;

        }
    }
}

以下是我实例化此类的代码:

$t = new CustomersTaxes($_SERVER['DOCUMENT_ROOT'] . '/test.xlsx');
$t->NoCie = NoCie::SC;
$t->NoClient = "d";
$t->CheckValidAndWrite();

我该怎么做?

2 个答案:

答案 0 :(得分:0)

我认为你混淆了两个概念,但也许你想要的东西可以通过其他方式实现。我现在唯一能想到的就是使用PHP方法类型提示。但是我会稍微重构一下,使NoCie属性受到保护,只能由getter和setter操纵。像这样:

class CustomersTaxes
{

    private $NoCie;
    private $_file;

    public function __construct($file)
    {
        $this->_file = $file;
    }

    public function getNoCie()
    {
        return $this->NoCie;
    }

    public function setNoCie(NoCie $NoCie)
    {
        $this->NoCie = $NoCie::VALUE;
    }
}

你仍然需要一个扩展抽象类的类,否则它永远不会起作用:

class SCA extends NoCie
{

    const VALUE = '01';
}

由于NoCie上的CustomersTaxes属性是私有的,因此您必须稍微设置一下:

$t = new CustomersTaxes($_SERVER['DOCUMENT_ROOT'] . '/test.xlsx');
$t->setNoCie(new SCA());
// ...

通过这种方式,您可以确保无论何时设置NoCie属性,它都将是您想要的类。无需验证 - 如果setNoCie由无效值触发,则会抛出异常。

答案 1 :(得分:0)

我想出了另一种没有类型提示的工作方式。类型提示似乎是一种很好的方法,但需要很多文件才能使用psr-4自动加载器。

我的选择是使用ReflectionClass将所有常量作为数组并比较来自$ this-&gt; SC的值。

NSMutableArray *newContent = [[NSMutableArray alloc] initWithContentsOfFile:plistPath];
NSMutableDictionary *dict = [newContent[1] mutableCopy];
dict[@"name"] = @"newVALUE";
newContent[1] = dict;
[newContent writeToFile:plistPath atomically:YES];