Подсчет параметров конструктора объекта (внешний метод)
Я пишу код, который автоматически загружает классы, и я столкнулся с проблемой, которая, как я думаю, вызвана слабостью реализации/типа дизайна. То, что я хочу сделать, - это подсчитать параметры объекта по умолчанию (внешние). Я могу посчитать количество переданных аргументов конструктору, но мне нужно будет проверить, что внутри конструктора объекта и этот метод мне не помогает.
ПРИМЕР КОДА:
// This is simple
function test($arg1,$arg2,$arg3) {return func_num_args();}
// How can I count like this?
class load
{
public function __construct($id="",$path="") {}
}
$l = new load();
// How to count object default parameters count(object($l)), I need answer to be 2`
МОЙ КОД, ГДЕ МНЕ НУЖНО ИСПОЛЬЗОВАТЬ ЭТОТ МЕТОД:
[файл: global_cfg.php]
<?php
// File: global_cfg.php
define(ROOT, __DIR__); // Root directory
define(DEBUG, true); // Set debugging state ON or OFF
define(MODE, "producer"); // If debug mode is ON: producer, publisher, tester
/*
* PATH CONFIGURATIONS:
*/
define(DS, "/");
define(LIB, "library");
/*
* SIGN AUTOLOAD CLASSES:
* Setting class sign to true value, the autoloader will create automatically
* an instance of the class lowercase type.
*/
$signClasses = Array
(
"Ralor" => false,
"NaNExist" => true,
"Message" => array(MODE),
"Debug" => DEBUG,
"Resource" => true,
"View" => true
);
[файл: autoload_classes.php]
<?php
// File: autoload_classes.php
require_once("global_cfg.php");
print "<b>Loaded classes:</b> <br>";
function __autoloadClasses($list, $suffix="class", $extension="php")
{
$path="";
foreach($list as $fileName => $classInstance)
{
$path = ROOT.DS.LIB.DS.$fileName.".".$suffix.".".$extension;
if(!file_exists($path))
{
print "Signed class ".$fileName." does not exist!<br>";
continue;
}
require_once($path);
print $path;
if($classInstance)
{
$GLOBALS[strtolower($fileName)] = new $fileName();
// ??? todo: counting default object parameters
$count = count(get_object_vars($GLOBALS[strtolower($fileName)]));
if(is_array($classInstance))
{
if($count<count($classInstance))
{
print "Arguments passed to object exceeds the limit";
}
else if($count>count($classInstance))
{
print "Insuficient arguments passed to the object!";
}
else
{
// todo: create object and pass parameters
$GLOBALS[strtolower($fileName)] = new $fileName(/*$arg1 .. $argn*/);
}
}
print $count." -> Class was instantiated!<br>";
continue;
}
print "<br>";
}
}__autoloadClasses($signClasses);
После этой проблемы я могу закончить свой бутстрэп.
1 ответ:
Вы можете использовать ReflectionFunctionAbstract::getNumberOfParameters. Например.
class load { public function __construct($id = "", $path = "") { } } function getNumberOfParameters($class_name) { $class_reflection = new ReflectionClass($class_name); $constructor = $class_reflection->getConstructor(); if ($constructor === null) return 0; else return $constructor->getNumberOfParameters(); } var_dump(getNumberOfParameters('load'));