使用 NuSoap 注册命名空间 PHP class 方法
Registering namespaced PHP class methods with NuSoap
是否可以使用 NuSoap 库注册一个 PHP 自动加载命名空间 class 方法?需要明确的是,PHP class 是命名空间的。这不是关于 XML 命名空间的问题。
例如,如果我在某个文件中定义了 class:
<?php
namespace \My\Fancy\Namespace;
class MyClass {
public static function foo() { /* ... */ }
// ...
}
我想在我的 soap 服务器上注册它:
<?php
use \My\Fancy\Namespace\MyClass; // autoloaded
$server = new soap_server();
// ... server configuration ...
$server->register(
'MyClass..foo' // This does not work
// ... etc. ...
);
我 运行 搜索了很多次都没有成功,所以我希望我没有问一个糟糕的问题。
On nusoap_server class in 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 命名空间功能正常工作。
我知道很长一段时间过去了,但我希望能帮助一些人回答这个问题。
是否可以使用 NuSoap 库注册一个 PHP 自动加载命名空间 class 方法?需要明确的是,PHP class 是命名空间的。这不是关于 XML 命名空间的问题。
例如,如果我在某个文件中定义了 class:
<?php
namespace \My\Fancy\Namespace;
class MyClass {
public static function foo() { /* ... */ }
// ...
}
我想在我的 soap 服务器上注册它:
<?php
use \My\Fancy\Namespace\MyClass; // autoloaded
$server = new soap_server();
// ... server configuration ...
$server->register(
'MyClass..foo' // This does not work
// ... etc. ...
);
我 运行 搜索了很多次都没有成功,所以我希望我没有问一个糟糕的问题。
On nusoap_server class in 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 命名空间功能正常工作。
我知道很长一段时间过去了,但我希望能帮助一些人回答这个问题。