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

Как я могу это сделать?

0

Решение

Я думаю, что вы путаете две концепции, но, возможно, то, что вы хотите, может быть достигнуто другим способом. Единственное, о чем я могу подумать сейчас, это использовать метод подсказки типа PHP. Но я бы немного переработал, сделав NoCie свойство защищено для манипулирования только получателем и установщиком. Как это:

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 вызвано недопустимым значением, оно выдаст исключение.

0

Другие решения

Я нашел другой способ сделать эту работу без подсказок типа. Похоже, что подсказки типов — хороший способ, но для работы с автозагрузчиком psr-4 нужно много файлов.

Мой выбор — использовать ReflectionClass, чтобы получить всю константу в виде массива и сравнить значение с $ this-> SC.

$NoCieReflection = new \ReflectionClass('\\Ogasys\\Enum\\NoCie');
if (!in_array($this->NoCie, $NoCieReflection->getConstants())) {
$error = true;
array_push($msg, "# de compagnie invalide");
}
0

По вопросам рекламы [email protected]