gpt4 book ai didi

php - 从不同的命名空间调用类

转载 作者:行者123 更新时间:2023-12-04 16:58:03 25 4
gpt4 key购买 nike

我有两个类,Router 和 Sammy,它们都在不同的命名空间中,但是我需要在 Router 类中调用 Sammy 类,但是它给了我一个错误

Notice: Undefined index: GlobeAPI\Classes\Router\Sammy in /opt/lampp/htdocs/web/globeapi/GlobeAPI/Classes/Autoloader/Autoloader.php on line 151

错误它的自身现在是 irelavent,我无法弄清楚如何正确调用 Sammy 类。

这是 Router.php 代码
 namespace GlobeAPI\Classes\Router;
class Router
{
public static $call = null;

function __construct()
{

}

public static function get($route, $call) {
self::$call = $call;
Sammy::process($route, 'GET');
}

public static function post($route, $call) {
self::$call = $call;
Sammy::process($route, 'POST');
}

public static function put($route, $call) {
self::$call = $call;
Sammy::process($route, 'PUT');
}

public static function delete($route, $call) {
self::$call = $call;
Sammy::process($route, 'DELETE');
}

public static function ajax($route, $call) {
self::$call = $call;
Sammy::process($route, 'XMLHttpRequest');
}

public static function dispatch()
{

$call = explode('#', self::$call);
$controller = $call[0];
$function = $call[1];

self::loadController($controller);
self::loadFunction($controller, $function);
}

public static function loadController($controller)
{
$path = APP_PATH . 'controllers/' . ucfirst($controller) . '.php';
if(file_exists($path))
{
include_once($path);
}else
{
return false;
}
}

public static function loadFunction($controller, $function)
{

$cls = ucfirst($controller);

if(class_exists($cls))
{
$tmp = new $cls();

if(is_callable(array($tmp, $function)))
{
$tmp->$function();
}else
{
echo 0;
}
}
}
}

这是 Sammy.php 代码
namespace GlobeAPI\Classes\Sammy;


class Sammy {

public static $route_found = false;

public $uri = '';

public $segments = '';

public $method = '';

public $format = '';

public static function instance() {
static $instance = null;

if( $instance === null ) {
$instance = new Sammy;
}

return $instance;
}

public static function run() {
if( !static::$route_found ) {
echo 'Route not defined!';
}

ob_end_flush();
}

public static function process($route, $type) {
$sammy = static::instance();

// Check for ajax
if( $type == 'XMLHttpRequest' )
$sammy->method = isset($_SERVER['HTTP_X_REQUESTED_WITH']) ? $_SERVER['HTTP_X_REQUESTED_WITH'] : 'GET';

if( static::$route_found || (!preg_match('@^'.$route.'(?:\.(\w+))?$@uD', $sammy->uri, $matches) || $sammy->method != $type) ) {
return false;
}

// Get the extension
$extension = $matches[count($matches)-1];
$extension_test = substr($sammy->uri, -(strlen($extension)+1), (strlen($extension)+1));

if( $extension_test == '.' . $extension )
$sammy->format = $extension;

static::$route_found = true;
Router::dispatch();

}

public function __construct() {
ob_start();
$this->uri = $this->get_uri();
$this->segments = explode('/', trim($this->uri, '/'));
$this->method = $this->get_method();
}

public function segment($num) {
$num--;

// Remove the extension
$this->segments[$num] = isset($this->segments[$num]) ? rtrim($this->segments[$num], '.' . $this->format) : null;

return isset($this->segments[$num]) ? $this->segments[$num] : null;
}

protected function get_method() {
return isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
}

protected function get_uri($prefix_slash = true) {
if( isset($_SERVER['PATH_INFO']) ) {
$uri = $_SERVER['PATH_INFO'];
}elseif( isset($_SERVER['REQUEST_URI']) ) {
$uri = $_SERVER['REQUEST_URI'];

if( strpos($uri, $_SERVER['SCRIPT_NAME']) === 0 ) {
$uri = substr($uri, strlen($_SERVER['SCRIPT_NAME']));
}elseif( strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0 ) {
$uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME'])));
}

// This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct
// URI is found, and also fixes the QUERY_STRING server var and $_GET array.
if( strncmp($uri, '?/', 2) === 0 ) {
$uri = substr($uri, 2);
}

$parts = preg_split('#\?#i', $uri, 2);
$uri = $parts[0];

if( isset($parts[1]) ) {
$_SERVER['QUERY_STRING'] = $parts[1];
parse_str($_SERVER['QUERY_STRING'], $_GET);
}else {
$_SERVER['QUERY_STRING'] = '';
$_GET = array();
}
$uri = parse_url($uri, PHP_URL_PATH);
}else {
// Couldn't determine the URI, so just return false
return false;
}

// Do some final cleaning of the URI and return it
return ($prefix_slash ? '/' : '').str_replace(array('//', '../'), '/', trim($uri, '/'));
}

public function format($name, $callback) {
$sammy = static::instance();
if( !empty($sammy->format) && $name == $sammy->format )
echo $callback($sammy);
else
return false;
}
}

$sammy = Sammy::instance();

最佳答案

由于这两个文件不在同一个命名空间中,您必须通过添加单词 use 来指定要使用的类。在 Router.php 上的命名空间声明之后是完整的类命名空间:

use GlobeAPI\Classes\Sammy\Sammy;

您可以在 documentation 上看到更多解释。

关于php - 从不同的命名空间调用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16509757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com