2015-06-05 5 views
2

Возможно ли зарегистрировать метод автозапускаемого пространства имен PHP с помощью библиотеки NuSoap? Чтобы быть ясным, класс PHP имеет пространство имен. Это не вопрос о пространстве имен XML.Регистрация методов класса PHP, основанных на именах, с помощью NuSoap

Например, если у меня был класс, определенный в некотором файле:

<?php 

    namespace \My\Fancy\Namespace; 

    class MyClass { 
     public static function foo() { /* ... */ } 
     // ... 
    } 

, и я хотел, чтобы зарегистрировать его с моим мыльного сервера:

<?php 

    use \My\Fancy\Namespace\MyClass; // autoloaded 

    $server = new soap_server(); 

    // ... server configuration ... 

    $server->register(
     'MyClass..foo' // This does not work 
     // ... etc. ... 
    ); 

Я бежал так много поисков это не повезло, поэтому я надеюсь, что я не задаю плохой вопрос.

+1

@Alex, я не верю, что это дубликат, поскольку этот вопрос касается пространств имен мыльных/XML-имен, а не пространств имен PHP. – jpheldson

+0

Я также ищу решение по той же проблеме !! черт! когда я получил ур вопрос по поиску Google, я был счастлив и надеялся, что он решит мою: -/ –

+0

@jpheldson Нашел решение? –

ответ

1

На nusoap_server класс в invoke_method метод, код не позволяет использовать пространство имен.

function invoke_method() { 
    // many lines of code... 

    $class = ''; 
    $method = ''; 
    if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1) { 
     $try_class = substr($this->methodname, 0, strpos($this->methodname, $delim)); 
     if (class_exists($try_class)) { 
      // get the class and method name 
      $class = $try_class; 
      $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim)); 
      $this->debug("in invoke_method, class=$class method=$method delim=$delim"); 
     } else { 
      $this->debug("in invoke_method, class=$try_class not found"); 
     } 
    } else { 
     $try_class = ''; 
     $this->debug("in invoke_method, no class to try"); 
    } 

    // many lines of code... 
} 

Но благодарю Бога за открытый исходный код, поэтому давайте модифицируем код!
Это то, что вы могли бы сделать:

function invoke_method() { 
    // many lines of code... 

    $class = ''; 
    $method = ''; 
    if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1) { 
     $try_class = substr($this->methodname, 0, strpos($this->methodname, $delim)); 
     if (class_exists($try_class)) { 
      // get the class and method name 
      $class = $try_class; 
      $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim)); 
      $this->debug("in invoke_method, class=$class method=$method delim=$delim"); 
     } else { 
      $this->debug("in invoke_method, class=$try_class not found"); 
     } 
    } elseif (strlen($delim) > 0 && substr_count($this->methodname, $delim) > 1) { 
     $split = explode($delim, $this->methodname); 
     $method = array_pop($split); 
     $class = implode('\\', $split); 
    } else { 
     $try_class = ''; 
     $this->debug("in invoke_method, no class to try"); 
    } 

    // many lines of code... 
} 

Разъяснение:

// Example of namespaced class 
// $this->methodname = 'Namespace.Namespace2.Class.MethodName'; 

// Has delimiter "." or ".." more than one time. 
if (strlen($delim) > 0 && substr_count($this->methodname, $delim) > 1) { 
    // code below 
} 

// Transform in array 
$split = explode($delim, $this->methodname); 
// $split = array('Namespace', 'Namespace2', 'Class', 'MethodName') 

// Get the last item (method name) and remove from array. 
$method = array_pop($split); 
// $method = 'MethodName' 
// $split = array('Namespace', 'Namespace2', 'Class') 

// Transform the class name 
$class = implode('\\', $split); 
// $class = 'Namespace\Namespace2\Class' 

С помощью этой простой модификации вы можете иметь особенность PHP имен работает.
Я знаю, что прошло много времени, но я надеюсь помочь кому-то с этим ответом.