jingcai-php/vendor/hanneskod/classtools/src/Instantiator/Instantiator.php

105 lines
2.6 KiB
PHP
Executable File

<?php
/**
* This program is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://www.wtfpl.net/ for more details.
*/
namespace hanneskod\classtools\Instantiator;
use ReflectionClass;
use hanneskod\classtools\Exception\LogicException;
/**
* Instantiate reflected class
*
* @author Hannes Forsgård <hannes.forsgard@fripost.org>
*/
class Instantiator
{
/**
* @var ReflectionClass Reflected class to instantiate
*/
private $class;
/**
* Set class to instantiate
*
* @param ReflectionClass $class
* @return void
*/
public function setReflectionClass(ReflectionClass $class)
{
$this->class = $class;
}
/**
* Get loaded reflection class
*
* @return ReflectionClass
* @throws LogicException If reflected class is not loaded
*/
public function getReflectionClass()
{
if (!isset($this->class)) {
throw new LogicException("Reflected class not loaded");
}
return $this->class;
}
/**
* Get number of required constructor parameters
*
* @return int
*/
public function countConstructorArgs()
{
if ($constructor = $this->class->getConstructor()) {
return $constructor->getNumberOfRequiredParameters();
}
return 0;
}
/**
* Check if class is instantiable
*
* @return boolean
*/
public function isInstantiable()
{
return $this->getReflectionClass()->isInstantiable();
}
/**
* Check if class is instantiable without constructor parameters
*
* @return boolean
*/
public function isInstantiableWithoutArgs()
{
return $this->isInstantiable() && !$this->countConstructorArgs();
}
/**
* Create instance
*
* @param array $args Optional constructor arguments
* @return mixed Instance of reflected class
* @throws LogicException If reflected class is not instantiable
*/
public function instantiate(array $args = array())
{
if (!$this->isInstantiable()) {
throw new LogicException("Reflected class is not instantiable");
}
if (count($args) < $this->countConstructorArgs()) {
throw new LogicException("Unable to instantiate, too few constructor arguments");
}
return $this->getReflectionClass()->newInstanceArgs($args);
}
}