swoole / phpy

Connecting the Python and PHP ecosystems together
Apache License 2.0
542 stars 44 forks source link

python类继承,PHP怎么实现 #34

Closed waojie closed 1 month ago

waojie commented 10 months ago

例如Python有个类

class Animal(object):
   def __init__(self, name, age):
       self.name = name
       self.age = age

   def call(self):
       print(self.name, '会叫')

php怎么实现Cat类继承Animal呢?

class Cat(Animal):
   def __init__(self,name,age,sex):
       super(Cat, self).__init__(name,age)  # 不要忘记从Animal类引入属性
       self.sex=sex
he426100 commented 10 months ago
  1. 在php中直接写python代码

// 假设test.php和Animal.py在同一个目录下 $sys = PyCore::import('sys'); PyCore::import('sys')->path->append(DIR);

$pycode = <<<CODE from t import Animal

class Cat(Animal): def init(self,name,age,sex): super(Cat, self).init(name,age) # 不要忘记从Animal类引入属性 self.sex=sex

def call(self):
   print(f'name {self.name}, age {self.age}, sex {self.sex}')

CODE;

$globals = new PyDict(); PyCore::exec($pycode, $globals);

echo $globals['Cat']('T', 0, 0)->call(), PHP_EOL;


2. 写一个py文件实现继承
- Cat.py
```python
from Animal import Animal

class Cat(Animal):
    def __init__(self,name,age,sex):
       super(Cat, self).__init__(name,age)  # 不要忘记从Animal类引入属性
       self.sex=sex

    def call(self):
       print(f'name {self.name}, age {self.age}, sex {self.sex}')

// 假设test.php和Animal.py在同一个目录下 $sys = PyCore::import('sys'); PyCore::import('sys')->path->append(DIR);

echo PyCore::import('Cat')->Cat('T', 0, 0)->call(), PHP_EOL;

matyhtf commented 10 months ago

没想通为什么要这样做,phpy 是可以让你创建 Python 类的对象,调用方法,而不是让 PHP 写 Py 代码。如果单纯的语言语法问题,PHP 应该用 PHP 的语法,与 Python 没有任何关系。

我能想到的只有一种情况一定要写一个 Py 子类去继承,大概是父类是一个抽象类,子类一定要继承后才能被构造。

import abc

class Animal(abc.ABC):
    @abc.abstractmethod
    def speak(self):
        pass

这个情况是无法用 phpy 去实现的,必须要用 Python 代码写一个中间层,继承抽象类,使子类可以被构造,然后就可以在 PHP 中被调用。

# dog.py
class Dog(Animal):
    def speak(self):
        print('woof')
$dog = PyCore::import("dog");

$obj = $dog->Dog();
$obj->speak();
matyhtf commented 2 months ago

最新的 1.0.8 支持 PHP 类继承 Python 类了

实例

use phpy\PyClass;

#[Inherit('Animal', 'animal')]
class Dog extends PyClass
{
    function __construct(string $name, int $age)
    {
        parent::__construct();
        $this->color = 'black';
        $this->super()->__init__($name, $age);
    }

    function speak(string $name): void
    {
        echo "Dog $name, color: {$this->self()->color}, speak: wang wang wang\n";
        $this->super()->speak('dog');
    }
}