import java vs include php?

时间:2015-11-18 20:32:18

标签: java php

我想知道php中的 include 和java中的 import 之间的区别

以及下面两个代码之间有什么不同:

//方法1:

package anyNameOfPackage;
public class Main{
   public class Test{
       public Test(){ //all stuff }
   }
   public static void main(String[] args) {
      // all stuff
   }
}

//方法2:

package anyNameOfPackage;
import otherPackageName.Test;
public class Main{

   public static void main(String[] args) {
      // all stuff
   }
}

是方法2(使用导入)意味着代码是在包anyNameOfPackage 类Main (如php中的include)之间或类之间创建的主要方法main()(如方法1)??

我对此导入感到困惑

3 个答案:

答案 0 :(得分:2)

这两个指令完全不同。

来自the PHP docs

  

include语句包含并评估指定的文件。 [强调我的]

Java中没有这样的机制。 Java的import指令允许您做的是使类可用于其他类。

也就是说,在Java中,而不是写:

final java.io.File file = ...;

你可以写:

import java.io.File;

// and anywhere in the class:
final File file = ...;

没有"代码评估"在Java;它不是脚本语言。您不能将Java文件包含在另一个Java文件中。

无论如何这都没有意义,因为根据规范,Java中的文件专门为一个类命名,因此在类路径中,类java.io.File将位于名为java/io/File.class的文件中(将从名为java/io/File.java)的源路径中的文件编译。

答案 1 :(得分:0)

PHP包含 php中的include在功能上等效(基于包含路径)将引用文件的源复制并粘贴到文件中。

<强> something.php

<?php
echo 'hello';
?>

<强> otherthing.php

<?php
include "something.php"
echo ', world!';
?>

otherthing.php的功能与

完全相同
<?php
echo 'hello';
echo ', world!';
?>

这意味着包含文件在定义函数,类和变量之外所做的任何事情都将是包含脚本中include进程的副作用。

Java导入

用于将符号导入当前范围。它不包括整个文件,也没有输出副作用。

import java.util.ArrayList;
// use ArrayList as if it were locally defined instead of typing java.util.ArrayList

答案 2 :(得分:-1)

导入和命名空间

Java包在Java中提供了名称间隔功能,尽管它们也具有访问语义。因此,package声明通常类似于PHP的namespace声明,import与PHP use或多或少相同as(它没有'但是具有use的所有功能。它与include没有任何联系。

所以,给定一个Java程序,如:

档案a/b/c/Class1.java

package a.b.c;

class Class1 {}

文件d/e/f/Class2.java

package d.e.f;
import a.b.c.Class1;

class Class2 {
    void c2() { 
        Class1 obj1 = new Class1();
    }
}

相当于:

package d.e.f;

class Class2 {
    void c2() { 
        a.b.c.Class1 obj1 = new a.b.c.Class1();
    }
}

与以下PHP文件的内容相同:

使用此Class1.php文件:

<?php
    namespace a\b\c;

    class Class1 {}

Class2.php文件:

<?php
    namespace d\e\f;
    use a\b\c\Class1;

    class Class2 {

        function c2() {
            $obj1 = new Class1();
        }
    }

相当于:

<?php
    namespace d\e\f;

    class Class2 {

        function c2() {
            $obj1 = new \a\b\c\Class1();
        }
    }

...假设您include中某处的require文件有自动加载或Class1.php / auto_prepend_file声明。

如果不是import中的Class2.java,编译器会认为Class1表示d.e.f.Class1(假定不合格的文件名属于当前包在编译单元的顶部声明)。以同样的方式,在PHP方面,如果use中没有Class2.php,则会认为Class1引用\d\e\f\Class1

包含和类路径可用性

您可能会说,等效于PHP的include是在运行javac命令编译Java代码时将jar文件或类文件放在类路径中。它在上述代码中没有include或自动加载(明确地或在auto_prepend_file中)Class1.php的意义上是等效的,当您尝试使用时,PHP中会出现错误Class2,如果在编译Class1.class时没有将Class2.java文件放在类路径中,则会出于同样的错误。这是因为它正在寻找符合名称\a\b\c\Class1a.b.c.Class1的实际类,但是类实现不可用。

但是include和classpath可用性等同,因为你不能在编译期间在Java源代码中包含代码 - 不是通过类路径,也不是导入,也不是任何东西。类路径只是编译器正在查找您正在使用的已编译类的位置,以确保您正确使用它们。您不能在其中放置任何打印或可执行语句。

摘要

  • import更像是PHP的use:它允许您使用其他包中的类而不使用其完全限定名称。
  • 为了正确编译java,导入的类需要使用类路径供编译器使用,在PHP中使用实际解释类定义的include / require来完成。 / LI>
  • 但PHP include / require可用于运行任意代码。没有与Java相同的内容。

参考

  1. Oracle, the Java tutorial, Using Package Members
  2. PHP manual, Using namespaces: aliasing/importing