Skip to main content

将 PHP 代码导入 Python

项目描述

这是一个用于运行 PHP 程序的 Python 模块。它允许您导入 PHP 函数、类、对象、常量和变量,以像常规 Python 版本一样工作。

# 例子

你可以调用函数:
```
>>> from phpbridge import php
>>> php.array_reverse(['foo', 'bar', 'baz'])
Array.list(['baz', 'bar' , 'foo'])
>>> php.echo("foo\n")
foo
>>> php.getimagesize("http://php.net/images/logos/new-php-logo.png")
数组([('0', 200), ('1', 106), ('2', 3), ('3', 'width="200" height="106"'), ('bits', 8), ('mime', '图像/png'







>>> print(date)
<DateTime PHP 对象 (date='2018-05-03 22:59:15.114277', timezone_type=3, timezone='Europe/Berlin')>
>>> date.getOffset()
7200
> >> php.ArrayAccess
<PHP interface 'ArrayAccess'>
>>> issubclass(php.ArrayObject, php.ArrayAccess)
True
```

你可以使用关键字参数,即使 PHP 不支持它们:
```
>>> date.setDate(year=1900, day=20, month=10)
<DateTime PHP 对象 (date='1900-10-20 22:59:15.114277', timezone_type=3, timezone='Europe/Berlin')>
` ``

你可以循环遍历迭代器和可遍历对象:
```
>>> for path, file in php.RecursiveIteratorIterator(php.RecursiveDirectoryIterator('.git/logs')):
... print("{}: {}".format(path, file.getSize()))
...
.git/logs/.: 16
.git/logs/..: 144
.git/logs/HEAD : 2461
[...]
```

你可以得到帮助:
```
>>> help(php.echo)
函数 echo 的帮助:

echo(arg1, *rest)
输出一个或多个字符串。

@param mixed $arg1
@param mixed ...$rest

@return void
```

你可以将命名空间作为模块导入:
```
>>> from phpbridge.php.blyxxyz.PythonServer import NonFunctionProxy
>>> help(NonFunctionProxy)
Help在模块 phpbridge.php.blyxxyz.PythonServer 中的类 blyxxyz\PythonServer\NonFunctionProxy 上:

类 blyxxyz\PythonServer\NonFunctionProxy(phpbridge.objects.PHPObject)
| 提供类似函数的语言结构作为静态方法。
|
| `isset` 和 `empty` 没有提供,因为它不可能是真实的
| 函数检查其参数是否已定义。
|
| 方法解析顺序:
| blyxxyz\PythonServer\NonFunctionProxy
| phpbridge.objects.PHPObject
| 内置对象
|
| 此处定义的类方法:
|
| array(val) -> 来自 phpbridge.objects.PHPClass 的字典
| 将值强制转换为数组。
|
| @param 混合 $val
|
| @return 数组
[...]
```

您可以索引并获取长度:
```
>>> arr = php.ArrayObject(['foo', 'bar', 'baz'])
>>> arr[10] = 'foobar'
>>> len( arr)
4
```

你可以使用 PHP 的异常:
```
>>> try:
... php.get_resource_type(3)
... except php.TypeError as e:
... print(e.getMessage() )
...
get_resource_type() 期望参数 1 是资源,给定整数
```

# 特性
* 使用 PHP 函数
* 支持关键字参数并根据签名进行翻译
* Docblocks 也被转换,因此 `help` 提供信息
* 使用PHP 类,如 Python 类
* 方法和常量是基于 PHP 类立即定义的
* Docblocks 被视为文档字符串,因此 `help` 有效并且提供信息
* 复制了原始继承结构
* 默认属性成为带有文档的 Python 属性
* 其他属性在fly 作为属性访问的后备
* 创建和使用对象
* 将命名空间作为模块导入
* 获取和设置常量
* 获取和设置全局变量
* 翻译异常,以便它们可以被视为 Python 异常和 PHP 对象
* 解释器中的选项卡完成
* PHP 对象的类似 Python 的

reprs
, 以更紧凑的形式包含 var_dump 等信息
您只能将基本的 Python 对象传递给 PHP
* 命名空间可以以不直观的方式隐藏名称
* 因为 PHP 只有一种数组,所以它的数组被转换为一种特殊的有序字典

# 名称冲突
一些 PHP 包使用相同的名称对于一个类和一个命名空间。以 nikic/PHP-Parser 为例。

`PhpParser\Node` 是一个类,但 `PhpParser\Node\Param` 也是一个类。这意味着 `phpbridge.php.PhpParser.Node` 变得模棱两可——它可以引用 `Node` 类,也可以引用 `Param` 类的命名空间。

在这种冲突的情况下,类优先于命名空间。要获取 `Param`,必须使用 `from` 导入:
```
>>> php.require('vendor/autoload.php')
<Composer.Autoload.C​​lassLoader PHP object (prefixLengthsPsr4=[...: (4)], ...>
>>> import phpbridge.php.PhpParser.Node as Node # Not the namespace!
>>> Node
<PHP interface 'PhpParser\Node'>
>>> from phpbridge.php.PhpParser. Node import Param # 我们想要的类
>>> Param
<
>>> import phpbridge.php.PhpParser.Node.Param as Param # 不起作用
Traceback (最近一次调用最后一次):
File "<stdin>", line 1, in <module>
AttributeError: type object 'PhpParser\Node ' 没有属性 'Param'
```

如果没有冲突,事情会按预期工作:
```
>>> from phpbridge.php.blyxxyz.PythonServer import Commands
>>> Commands
<PHP class 'blyxxyz\PythonServer\Commands '>
>>> import phpbridge.php.blyxxyz.PythonServer as PythonServer
>>> PythonServer
<PHP namespace 'blyxxyz\PythonServer'>
>>> PythonServer.Commands
<PHP class 'blyxxyz\PythonServer\Commands'>
```

# 安装
唯一的依赖项是 PHP 7.0+、Python 3.5+、ext-json 和 ext-reflection。Composer 可用于安装开发工具和设置自动加载,但这不是必需的。


项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

phpbridge-0.0.3.tar.gz (25.4 kB 查看哈希

已上传 source

内置分布

phpbridge-0.0.3-py3-none-any.whl (35.8 kB 查看哈希

已上传 py3