У меня есть абстрактный класс, как это:
<?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();
Как я могу это сделать?
Я думаю, что вы путаете две концепции, но, возможно, то, что вы хотите, может быть достигнуто другим способом. Единственное, о чем я могу подумать сейчас, это использовать метод подсказки типа 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
вызвано недопустимым значением, оно выдаст исключение.
Я нашел другой способ сделать эту работу без подсказок типа. Похоже, что подсказки типов — хороший способ, но для работы с автозагрузчиком 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");
}