如何以及在何处使用php

时间:2017-03-31 08:43:13

标签: php class namespaces traits codeception

我曾经在类定义上面使用关键字“use”。像这样:

<?php
namespace suites\plugins\content\agpaypal;
use \Codeception\Util\Fixtures;
use \Codeception\Verify;
use \Codeception\Specify;

class agpaypalTest extends \Codeception\Test\Unit
{
    protected $tester;
    ...

但现在我意识到,我必须将特性指定的行放入类定义中。像这样:

 <?php
namespace suites\plugins\content\agpaypal;
use \Codeception\Util\Fixtures;
use \Codeception\Verify;

class agpaypalTest extends \Codeception\Test\Unit
{
    use \Codeception\Specify;

    protected $tester;
    ...

我认为这是因为包\ Codeception \ Specify;是一种特质。但是我不明白为什么在设置这条线时我无法重复使用这个特性 use \ Codeception \ Specify; 在课程定义之前?

如果有人能指出我的提示或解释,我会很高兴向我解释我应该在哪里使用关键词“使用”最好的。

3 个答案:

答案 0 :(得分:6)

在PHP中,关键字use用于3种情况:

  1. 作为类名别名 - 只需声明类的短名称(必须在类定义的外部声明) (manual: Using namespaces: Aliasing/Importing
  2. 向类中添加特征(必须在类定义中声明之内(在顶部)) (manual: Traits
  3. 在匿名函数定义中传递函数内部的变量 (manual: Anonymous functions

答案 1 :(得分:3)

use基本上包含文件中的一个类来使用它。 有两种方法可以将类文件包含在另一个文件中。 最常见的是requireinclude方法。另一种方法是使用作曲家。假设此目录结构

Project
  |
  |--- Folder A
  |      |
  |      |---UserRegistration.php
  |
  |---Example
         |
         |--TestUserRegistration.php    

在文件夹A中有UserRegistartion.php,您希望使用TestUserRegistration.php中的代码UserRegistration.php它可以是classtrait或{{1 }}

方法1。

Interface TestUserRegisteration.php您可以includerequire提交UserRegistartion.php 并使用它

方法2

使用Composer。在UserRegistration.php中,您将namespace FolderA;定义为第一行代码。然后像你一样编写代码。所以现在你要在TestUserRegistration.php中使用这个文件

include vendor/autoload.php;
use FolderA\UserRegistration;

哪一个更好,为什么?

使用composer的方法2是最好的方法。在方法1中,只要您想要包含UserRegistration,就必须找到UserRegistration文件的相对路径。因此,假设有一天你需要更改应用程序将破坏的目录结构,因为它现在提供的相对路径不存在。

但在方法2中,您始终使用您提供的名称空间\文件名而不是您要使用的名称。因此,即使您更改了您没有的目录结构,也无法获取所有代码并修改路径。它将按原样工作。 要了解有关如何使用namespacecomposer的更多研究。

答案 2 :(得分:2)

您无法使用include关键字导入课程。您必须使用require / include声明。即使您使用某些php自动加载器,仍然自动加载器必须在内部使用requirerequire

使用关键字的目的:

考虑一个你有两个同名的类的情况;你会发现它很奇怪,但是当你使用大型MVC结构时,会发生这种情况。因此,如果您有两个具有相同名称的类,请将它们放在不同的名称空间中。现在考虑一下你的自动加载器何时加载两个类(由use完成),并且你将要使用类的对象。在这种情况下,编译器会混淆哪两个类对象加载。为了帮助编译器做出决定,您可以使用{{1}}语句,以便它可以决定将使用哪一个。

这里提到这个 How does the keyword 'use' work