web-dev-qa-db-ja.com

グローバルPHP関数?

globalphp functions任意のJoomlaから呼び出すことができますcustom module?たとえば、selectデータベースクエリを実行するグ​​ローバル関数を作成します。

function select($row,$table_name,$where,$equals) {

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($row)
      ->from($db->quoteName($table_name))
      ->where($db->quoteName($where) . "=" . $db->q($equals));
$db->setQuery($query);
$result = $db->loadResult();
$row = $db->loadAssoc();
return $row[$row];

}

そして、それを任意のモジュールから呼び出します:

$result = select('id','#__table','name','john');

これを達成するための最良の方法は何でしょうか?

2
saibbyweb
  1. グローバル関数を追加するには、クラスに属していないライフサイクルの早い段階で関数を宣言する必要があります。すべての関数自体は、phpではグローバルです。オーバーライドされないようにするための適切な場所は、システムプラグインのクラス宣言の外になります。そこにある関数はすべて、joomlaの初期化中にグローバルスペースに追加されます。プラグインを無効にすると、関数のロードが停止します。これを行う場合は、関数が他の関数と衝突しないものと呼ばれることを確認する必要があります。これは良い習慣ではありませんが、何でもいいのです。

  2. 私がお勧めするのは、代わりに静的メソッドを使用して、jloaderでライブラリフォルダーにクラスを登録することです。ドキュメントはこちらです https://docs.joomla.org/Using_own_library_in_your_extensions

つまり、自分のlib Pfを呼び出すと、/ libraries/pf/helper.phpというファイルができます。

<?php
class PfHelper
{
    public static function sayWooh()
    {
        return "wooh!";
    }
}

そして、ライブラリを登録するシステムプラグイン-これは、上記のリンク先のドキュメントで詳述されている命名規則に従うライブラリ内のすべてのクラスを自動ロードします。

システムプラグインには、最低2つのファイルが必要です。 /plugins/system/loadcustomlibrary.xml

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="system">
    <name>Load Custom Library</name>
    <version>1.0</version>
    <description>Register custom library with Joomla's autoloader</description>
    <files>
        <filename plugin="loadcustomlibrary">loadcustomlibrary.php</filename>
    </files>
</extension>

/plugins/system/loadcustomlibrary.php

<?php
class plgSystemLoadcustomlibrary extends JPlugin
{
    public function onAfterInitialise()
    {
        JLoader::registerPrefix('Pf', JPATH_LIBRARIES . '/pf');
    }
}

これでJoomlaのどこでも、ヘルパーの次のような関数を使用できます。

echo PfHelper::sayWooh();

利点は、ライブラリ名がJoomlaライブラリフォルダーに既にあるもののコピーではないことを確認するだけでよいことです。 Joomlaは、自動ロードされるため、使用している場合にのみヘルパークラスをロードします。毎回何かをインポートする必要がなく、関数/メソッドをどこからでも呼び出すことができるという単純さをまだ得ることができます。再利用性や保守性などに役立つ可能性がある関数がたくさんある場合は、関数をクラスに分割できます。独自のライブラリを用意することは、どこかでコードを使用したいかどうかを知るための素晴らしいテクニックです。

2
jamesgarrett

「グローバル」関数を作成することは避けてください。はい、それを書くのは非常に簡単ですが、Joomlaの建築設計に反対するでしょう。

これを行うための提案された方法は、共有リスナーをプラグインとして実装し、関数をイベントリスナーとして作成することです。心配しないで、思ったより簡単です。

  1. 次のようなプラグインを作成します。

    class PlgXyzMyPlugin extends JPlugin    // <-- replace 'xyz' with whatever you want; ie a relevant and unique plugin type name.
    {
        public function onMyEvent()         // <-- it's an event listener, so name should start with 'on'.
        {
            //...your code here
        }
    }
    
  2. 関数を呼び出す場所はどこでも、次のように記述します。

    JPluginHelper::importPlugin('xyz');  // <-- 'xyz' here is the same as in the plugin classname above.
    $dispatcher = JEventDispatcher::getInstance();
    $results = $dispatcher->trigger('onMyEvent', $args);  //event name is the function name. $args is an array of the parameters.
    

$resultsには、関数の結果の配列と、同じプラグインタイプのその他の結果が含まれます。

これにより、必要な場所で関数を使用できますが、グローバルにはなりません。

また、追加の利点もあります。関数にバグを見つけた場合、または機能を改善したい場合は、他のすべてのモジュールに手を加える必要なく、プラグインをアップグレードできます。

1
Simba