2016-03-29 3 views
2

私はcodeigniterにロードしたい静的関数のクラス(共通のユーティリティ関数)を持っています。現在、通常はinclude_once(...)を使用してロードしていますが、期待どおりに動作します。CodeIgniter:自分のクラスの静的関数をコントローラにロードする方法は?

ただし、codeigniterの方法論を使用して読み込みたいとします。クラスファイルをthird_partyディレクトリに保存する必要があることを理解しています。私はクラスを必要とするライブラリクラス(ライブラリディレクトリに保存する)を作成する必要があります。

以下は3つのコンポーネントですが、動作しません。

// saved at: APPPATH.'libraries/Library_Wrapper.php' 
if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Library_Wrapper 
    { 
    public function __construct() 
     { 
     require_once APPPATH.'third_party/My_Class.php'; 
     } 
    } 

3: -

// my class, saved at: APPPATH.'third_party/My_Class.php' 
class My_Class 
    { 
    public static function my_static_utility_method () 
     { 
     return "booger" ; 
     } 

    // ... 
    } 

私は '図書館' のインスタンスのCIの規則に従うラッパーを作成することになっていますということを理解します -今、私はcontrからMy_Classの静的メソッドにアクセスしたいoller:

// saved at: APPPATH.'controllers/my_controller.php' 
class My_Controller extends CI_Controller 
    { 

    public function __constructor() 
     { 
     parent::__construct(); 
     $this->load->library('Library_Wrapper') ; 
     } 

    public function some_function() 
     { 
     echo $this->My_Class->my_static_utility_method() ; 
     } 

    } 

答えて

1

は、以下の手順を試してください:application/core/MY_Controller.php

  1. は、新しいコントローラファイルを作成します。そのファイルに静的関数を追加することができます。

    <?php 
    
    class MY_Controller extends CI_Controller { 
    
        protected function static_fn1() { 
         //code 
        } 
    } 
    
  2. 静的関数にアクセスする必要があるのコントローラのような、このクラスを拡張することがあります。 ファイル:application/controllers/Welcome.php

    <?php 
    
    class Welcome extends MY_Controller { 
    
        public function fnname() { 
         //code 
        } 
    } 
    
+0

CI3を使用していて、クラスの最初の文字とコントローラのファイル名を適用する必要がある場合は、こちらをご覧ください。http://www.codeigniter.com/user_guide/general/controllers.html#let-s-try-it-hello -world – user4419336

+0

私は大文字が実際に本当の機能的効果を持っているとは思わない? – dsdsdsdsd

+0

@dsdsdsdsd - それはあなたの仕事ですか? –

1

あなたは、ほとんどの場所で第三ステップを得たが、いませんでしたかなり。代わりにLibrary_wrapper

//Will throw an PHP undefined My_Class error 
echo $this->My_Class->my_static_utility_method(); 

:だからあなたの場合には、あなたからライブラリにアクセスする方法を切り替える必要があると思い

//Load library 
$this->load->library('Some_name'); 
//Use Library 
$this->some_name->someFunction(); 

:ライブラリをロードすると、あなたがそれをロードされた同じ名前になります。

//from $this->load->library('Library_wrapper'); 
echo $this->library_wrapper->my_static_utility_method(); 

しかしMy_Classがlibrary_wrapperの財産であるとして、これはそれが少し長くなります呼び出す次の問題を提示:

echo $this->library_wrapper->My_Class->my_static_utility_method(); 

公然とアクセス可能であれば、My_Class子孫メソッドを正常に呼び出すはずです。

これは、あなたが知る限り、きれいではありません。

/** 
* Static helper methods: 
**/ 
class Library_wrapper extends My_Class { 

} 

それが(参照「ロード」different nameにライブラリをバインドする可能である「とは、異なるオブジェクト名へのライブラリの割り当て」:それは代わりに静的インスタンスを共有するLibrary_wrapperMy_Classを延長した方が良いでしょうヘッダ)。

+0

残念ながらそれは動作していません...私はまだ '致命的なエラーが発生します:C:\ Server \ htdocs \ ... \ my_controller.php 25行目の非オブジェクトのメンバ関数my_static_utility_method()を呼び出します。 ...しかし、私はまた、(必要ではなく)ライブラリからの延長で遊んでいきます...あなたの答えと時間に感謝します。 – dsdsdsdsd

+0

他のコメント投稿者@ wolfgang1983は、クラスとメソッドの大文字と小文字の区別が重要ですあなたはCodeIgnitierを呼び出しています。特にPHPでクラスのプロパティは大文字と小文字が区別されるため([参照例](http://sandbox.onlinephpfunctions.com/code/dcc47517e618afe20526e654127daff3b9f624aa))コントローラから呼び出されるものです)ので、「ucfirst」と考えるのを覚えておいてください'$ this-> load'メソッドです。 – MackieeE

0

あなたは、以下のソリューション試すことができます。)(この階層の$ this - > library_wrapper-> My_Class-> my_static_utility_methodに

を。

Php Functionsにリストされているphp関数を使用して、階層内の各ポイントでメソッド/変数を調べます。これは物事がうまくいかない正確な場所を指し示します。

0

私はあなたがクラスを構築する必要はないと思う。最も簡単な方法はヘルパーです("ヘルパーは、名前が示すように、タスクに役立ちます。各ヘルパーファイルは単に特定のカテゴリの関数の集合です" - ちょうどofficial tutorialから記事を読んでください)。 myfunctions_helper.phpのような名前を持つ

あなたのヘルパーファイルが/application/helpersフォルダに配置されますと、このような構造を持つことができます:

<?php 
defined('BASEPATH') OR exit('No direct script access allowed'); 

if (!function_exists('my_static_fuction')) { 
    function my_static_fuction () 
    { 
     return "booger" ; 
    } 
} 

// etc... 

次に、あなたのautoload /application/config/autoload.phpにそれを宣言するヘルパーをすることができます。

$autoload['helper'] = array('url','myfunctions'); 

クラスを構築する必要がある場合は、@MackieeEのようなライブラリーは、ジョブ(詳細はcheck the tutorial)を行います書きました。

関連する問題