php使用了非指定的类

时间:2018-07-16 07:32:05

标签: php laravel

我遇到了一个很奇怪的问题。

我有两个类,一个在 App \ Projects \ github \ Units \ github_login 中,另一个在 App \ Projects \ github \ Schema \ github_login

中>

Schema文件只是一个方案,它显示文件 App \ Projects \ github \ Units \ github_login 骨骼结构

实际上,它永远不应该被加载和执行,只适合人类使用。

但是,PHP总是执行此文件,而不是 App \ Projects \ github \ Units \ github_login

namespace App\Http\Controllers;

use App\Models\Selenium;
use App\Models\Project;
use App\Projects\github\Units\github_login;

class PlayController extends BasePlayController
{
    private $github_login;

    function __construct()
    {
        parent::__construct();
        $this->github_login = new github_login();
    }

    /**
    * Play a testcase X times.
    *
    * @param string $Project
    * @param string $Unit
    * @param string $Scenario
    * @param string $Testcase
    * @param int $Times
    * @param int $Delay
    * @return /Illuminate/View/View
    */
    public function PlayCase($Project, $Unit, $Scenario, $Testcase, $Times=1, $Delay=3)
    {
        $SeleniumObj = $this->Selenium;

        $Unit =  $Project .'_'. $Unit;

        switch ($Project) {
            case 'github':
                switch ($Unit) {
                    case 'github_login':
                        switch ($Scenario) {
                            case 'standard':
                                 $this->callCase(array($this->github_login, 'standard'), $Testcase, $Times, $Delay);
                                break;
                            default:
                                $SeleniumObj->logMessage[$SeleniumObj->index]['TestcaseTitle'] = $Scenario;
                                $SeleniumObj->setMessage(2,"Das Szenario '<strong>". $Scenario ."</strong>' existiert nicht!", '');
                        }
                        break;
                }
                break;
            default:
                $SeleniumObj->setTitle('Projekt existiert nicht.');
                $SeleniumObj->setMessage(2,'Das Projekt <strong>'. $Project .'</strong> existiert nicht. (Fix: einfach neuen Testfall anlegen)', '');
        }

        return view('show.report')->with('driver',        $SeleniumObj->driver)
                                  ->with('ScenarioName',  $Scenario)
                                  ->with('logMessage',    $SeleniumObj->logMessage)
                                  ->with('execScriptRet', $SeleniumObj->execScriptRet)
                                  ->with('screenshot',    $SeleniumObj->screenshot)
                                  ->with('PlayAll',       false);
    }

如您在屏幕快照中所见,它甚至加载了正确的文件,但是到底如何执行文件夹Schema中的文件?

enter image description here

我正在进行硒测试,并使用github登录页面进行启动。

更新:

BasePlayController-callCase:

namespace App\Http\Controllers;

use App\Models\Selenium;

class BasePlayController
{
    public $Selenium;

    function __construct()
    {
        $this->Selenium = new Selenium();
    }

    public function callCase($thisFunction, $Testcase, $Times=1, $Delay=1)
    {
        $SeleniumObj = $this->Selenium;

        if (is_numeric($Times)) {
            for($i = 1; $i <= $Times; $i++) {

                $thisFunction($SeleniumObj, $Testcase);
                sleep($Delay);
            }
        } else {
            $SeleniumObj->logMessage[$SeleniumObj->index]['TestcaseTitle'] = 'Falscher Parameter für Times.';
            $SeleniumObj->setErrorMessage("Times muss eine Zahl sein! (Gegeben: '<strong>". $Times ."</strong>')", '');
        }
    }

 ...

更新2

vendor \ composer \ autoload_classmap.php

中的自动加载程序条目
'App\\Projects\\github\\Units\\github_login' => $baseDir . '/app/Projects/github/Schema/github_login.php',

我试图将其更改为

'App\\Projects\\github\\Units\\github_login' => $baseDir . '/app/Projects/github/Units/github_login.php',

但这没什么区别。

2 个答案:

答案 0 :(得分:1)

假设您有2个文件声明了相同的类。 Composer正在扫描目录以查找类并将类映射到其位置。碰巧是因为每个键只能指向Schema中的重复类。不用深入了解内部情况,这就是我的快速想法。

该文件说它在X名称空间中,而类名是Y ...不管它实际存在于哪里,都是这样。

我想您不能有2个文件声明相同的类(在有类映射的文件夹中的任何地方),或者使重复的文件不是有效的php文件,也许将其设为.phps。 ...并减少自动加载。

答案 1 :(得分:0)

我找到了原因。我不得不从{p>更改vendor\composer\autoload_static.php中的自动加载器条目

'App\\Projects\\github\\Units\\github_login' => __DIR__ . '/../..' . '/app/Projects/github/Schema/github_login.php',

'App\\Projects\\github\\Units\\github_login' => __DIR__ . '/../..' . '/app/Projects/github/Units/github_login.php',

但是我想知道为什么我必须手动执行此操作。