5

これらを見てきましたが、

別のファイル名でクラスを自動ロードする方法は? PHP

引数としてオートローダーに渡されたものとは異なる名前のクラスをロードします

私は変更できますが、私の MV* 構造には次のものがあります。

/models
    customer.class.php
    order.class.php
/controllers
    customer.controller.php
    order.controller.php
/views
...

実際のクラスでは、

class CustomerController {}
class OrderController{}
class CustomerModel{}
class OrderModel{}

私は名前と一致させようとしていました。クラス名の接尾辞 (Controller、Model) を付けないと、再宣言しているため、クラスをロードできません。

クラスの名前をそのままにしておくと、autoload は次の名前のクラス ファイルを探すため、失敗します。

CustomerController

ファイル名が実際の場合、

customer.controller.php

私の唯一の方法は(順不同):

  • create_aliasを使用する
  • ファイルの名前を変更します (customer.model.php から customermodel.php に)
  • クラスの名前を変更する
  • 正規表現を使用する
  • インクルード ファイル ( 、 など) でブートストラップをinclude使用 require_onceする

?

サンプルコード、

function model_autoloader($class) {
    include MODEL_PATH . $class . '.model.php';
}

spl_autoload_register('model_autoloader');

ファイルの名前を変更する必要があるようですが、

http://www.php-fig.org/psr/psr-4/

「終了クラス名は、.php で終わるファイル名に対応します。ファイル名は、終了クラス名の大文字と小文字を一致させる必要があります。」

4

1 に答える 1

1

これは、いくつかの基本的な文字列操作といくつかの規則で処理できるように見えます。

define('CLASS_PATH_ROOT', '/');

function splitCamelCase($str) {
  return preg_split('/(?<=\\w)(?=[A-Z])/', $str);
}

function makeFileName($segments) {
    if(count($segments) === 1) { // a "model"
        return CLASS_PATH_ROOT . 'models/' . strtolower($segments[0]) . '.php';
    }
    
    // else get type/folder name from last segment
    $type = strtolower(array_pop($segments));
    
    if($type === 'controller') {
        $folderName = 'controllers';
    }
    else {
        $folderName = $type;
    }
    
    $fileName = strtolower(join($segments, '.'));
    
    return CLASS_PATH_ROOT . $folderName . '/' . $fileName . '.' . $type . '.php';
}

$classNames = array('Customer', 'CustomerController');

foreach($classNames as $className) {
    $parts = splitCamelCase($className);
    
    $fileName = makeFileName($parts);
    
    echo $className . ' -> '. $fileName . PHP_EOL;
}

出力は

顧客 -> /models/customer.php

CustomerController -> /controllers/customer.controller.php

makeFileNameオートローダー関数内で使用する必要があります。

私自身、このようなものには強く反対しています。名前空間とクラス名を反映する名前空間とファイル名を使用します。Composerも使用します。

(私はsplitCamelCase ここで見つけました。)

于 2015-06-17T15:12:18.833 に答える