当PHP是用C语言编写的时候,它怎么会是一种脚本语言呢?


How is PHP a Scripting Language when it's written in C?

这个问题已经困扰我一段时间了。这听起来可能很傻!

我从PHP源代码和这个问题中了解到PHP的核心功能是用C编写的。现在,考虑到C是一种编译语言,我想知道PHP是如何成为一种脚本语言的?此外,PHP是面向对象的,而C不是!

我想知道它是如何在内部工作的,或者一些高层次的细节。那么,这是如何抽象的呢?

从头开始,你需要理解像面向对象这样的特性并不会让语言变得更强大。在面向对象语言中,没有什么是在汇编语言中做不到的。面向对象只是一种不同的书写方式。

例如,如果你有这样一个类(这里使用Java,但对于任何其他面向对象语言都是一样的):

class Foo {
    int x,y;
    int getSum(int z) {
        return x+y+z;
    }
}

等于

struct Foo {
    int x, y;
}
int getSum(Foo foo, int z) {
    return foo.x+foo.y+z;
}

所以这里你有一些代码和上面的代码完全一样,但不是面向对象的。所以任何编译或解释面向对象代码的编译器或解释器都可以通过创建与面向对象代码相同的代码来将代码翻译成机器可以理解的东西,但是没有面向对象。此外,它实际上把它翻译成机器代码,做与原始代码相同的事情。

@第二点(为什么PHP解释而c不解释):把PHP解释器想象成一个用c语言编写的程序,它只是遍历代码并执行代码所做的任何事情。接下来要做的是大大简化。以这个例子为例(同样是在Java中,但同样,在任何语言中都是一样的):

String phpCode="print('Hello World');exit();";
String[] tokens = phpCode.split(";").strip();
for (String token : tokens) {
    if (token.startsWith("print")) {
        String param = phpCode.replace("print(","").replace(")","");
        System.out.println(param);
    } else if (token.equals("exit()")) {
        System.exit(0);
    }
}

它的作用是解释phpCode的内容。目前理解的关键词是printexit。一个真正可用的解释器要复杂得多,但这是基本的概念。它遍历代码,将其分割成它可以理解的部分,然后执行执行解释后代码应该做的事情的代码。