Laravel:Non-static methodのエラーが発生した時の対応方法

Laravelで「Non-static method」のエラーが発生した時の対応方法をメモします。

このエラーはstaticではないメソッドを呼び出すときに発生します。
Laravelに限らずではありますが。。。

下記に「Non-static method」エラーの説明と対応方法を記載します。


「Non-static method」のエラー内容

実際のエラー内容としては、下記のようにエラーが出力されます。
簡単にいえば「staticではないですよー」ってことですね。

ErrorException: Non-static method App\Models\Hoge::getHoge() should not be called statically

 

「Non-static method」エラーになる原因

例で下記のようにコントローラーからモデルのメソッドを呼び出します。

【Controller】

下記は「Hoge」モデルクラスの「getHoge」メソッドを呼び出しています。

use App\Models\Hoge;

class SampleController extends Controller
{
    public function index()
    {
        Hoge::getHoge();
    }
}

 

【Models】

下記の場合はエラーになってしまいます。
原因はfunctionに「static」が無いからです。

class Hoge extends Model
{
    public function getHoge() {
        // 処理
    }
}

なので「static」があればエラーにならず正常に動作します。

class Hoge extends Model
{
    public static function getHoge() {
        // 処理
    }
}

 

「Non-static method」エラーの対処方法

上記のように「static」付ければ解決することはできますが、モデルを変更できない場合はコントローラー側で下記のように呼び出すとエラーとならずメソッドを呼び出すことができます。

【変更前】

use App\Models\Hoge;

class SampleController extends Controller
{
    public function index()
    {
        $res = Hoge::getHoge();
    }
}

 

【変更後】

use App\Models\Hoge;

class SampleController extends Controller
{
    public function index()
    {
        $model = new Hoge();
        $res = $model->getHoge();
    }
}

このように呼び出すことによって「Non-static methodエラーを解消することができます。

 


今回は「Non-static methodエラーが発生した時の対応方法について記載しました。
以外と忘れてしまうことがあるのでメモします。

Fuelphp:Agentクラスでエラーが起きた場合の対処方法

FuelphpAgentクラスを使用している時にエラーが起きたことがあったので、
そのエラーが起きた時の対処方法をメモします。

FuelphpのAgentクラスを使用していると、古いバージョンの場合にエラーが起きる可能性があります。

下記のようなエラーが発生しました。

Warning!

ErrorException [ Warning ]: file_get_contents(http://browsers.garykeith.com/stream.asp?Lite_PHP_BrowsCapINI) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 410 Gone

COREPATH/classes/agent.php @ line 446:

445:	ini_set('user_agent', 'Fuel PHP framework - Agent class (http://fuelphp.com)');
446:	$data = file_get_contents(static::$config['browscap']['url']);
447:	default:

UserAgentを判定する時に使用するURL(browscapファイル)のサイトが閉鎖してしまったようで
URLが変更になっておりました。

このようなエラーが起きた場合は、取得するURLを変更する必要があります。

下記に対処方法を記述します。


FuelphpのAgentクラスでエラーが起きた場合の対処方法

コアクラスの「fuel/core/config/agent.php」で読み込むファイルを指定しているので、
オーバーライドして「fuel/app/config/agent.php」を作成(コピー)します。

次のURLを読み込むように変更します。

http://browscap.org/stream?q=Lite_PHP_BrowsCapINI

ファイルをコピーしたら下記のように変更します。

変更前

<?php

return array(

    'browscap' => array(

        'enabled' => true,

        'url' => 'http://browsers.garykeith.com/stream.asp?Lite_PHP_BrowsCapINI',

        'method' => 'wrapper',

        'file' => '/tmp/php_browscap.ini',
    ),

「url」で指定しているファイルを変更します。

変更後

<?php

return array(

    'browscap' => array(

        'enabled' => true,

        'url' => 'http://browscap.org/stream?q=Lite_PHP_BrowsCapINI',

        'method' => 'wrapper',

        'file' => '/tmp/php_browscap.ini',
    ),

上記のように変更し、サーバにアップすればエラーが出なくなります。


また、下記の方法でもOKです。

browscapファイルをダウンロードし、ローカルに設置したファイルを読み込みます。

※「fuel/app/config/lite_php_browscap.ini」に設置した場合

<?php

return array(

    'browscap' => array(

        'enabled' => true,

        'url' => 'http://browscap.org/stream?q=Lite_PHP_BrowsCapINI',

        'method' => 'local',

        'file' => APPPATH . 'config/lite_php_browscap.ini',
    ),

「method」を「local」に変更し、
「file」に読み込むファイル「lite_php_browscap.ini」を
指定すればダウンロードしたファイルを読み込むことができます。


Agentクラスを使用してエラーが起きた場合はチェックしてみてください。

PHP:defineで定数の2重定義はエラーになる

phpdefineを使用し、定数定義した時に同じ名前の定数を2重で定義するとエラーになります。

例えば下記のように、処理の中で同じ名前の定数を複数定義します。

define('TEST', 'テスト');

define('TEST', 'test');

echo TEST;

出力結果は1度目に定義した値が出力されます。

テスト

一度定義した定数は再定義することができないのです。

2重定義をすると、下記のようなエラーが返ってきます。

Constant TEST already defined

フレームワークなどを使用している場合、複数のファイルを読み込むことが多いので注意が必要です。
また、requireincludeでファイルをインクルードしている場合も注意した方がいいと思います。

色々な箇所で定数を定義していると、2重定義をする可能性があるかもしれないので
定数を定義するファイルはなるべく一つにまとめた方がいいのかなと思います。

defined()関数を使用すれば、すでに定数が存在するかわかるので、
下記の方法で2重定義を防ぐことが可能です。


2重定義を防ぐ方法

defined()はすでに定数が存在するか調べることができる関数です。
指定した値が定数で定義させている場合は「true」、定義されていない場合は「false」を返します。

なので、定義されていない場合に定数をセットするようにすればOKです。

if (!defined('TEST')) {
	define('TEST', 'テスト');
}

Linux:Gmailにアカウントを設定した時のエラー対処

Gmailに他のメールアカウントを設定しようとした際、エラーが出力されて設定できませんでした。
そのエラーが出た時の対処方法をメモします。

Gmailに他のメールアカウントを設定する時は、設定画面のアカウントタブを開き「自分の POP3 メール アカウントを追加」をクリックします。

gmail_account1

gmail_account2

メールアドレス入力後、メール設定した時に下記のエラーが表示されました。

gmail_account3

Connection timed out: There may be a problem with the settings you added. Please contact your other email provider to verify the correct server name and port.

色々調査したところ、サーバファイアウォールの設定に問題がありました。
iptablesの設定で110番ポートが日本からのみアクセス許可されていたのが原因だったようです。

下記にiptablesの変更点を記載します。


iptablesの設定変更

「ACCEPT_COUNTRY」を「ACCEPT」に変更します。

-A INPUT -p tcp -m tcp --dport 110 -j ACCEPT_COUNTRY

-A INPUT -p tcp -m tcp --dport 110 -j ACCEPT

設定完了後、再度Gmailに設定したら正常に設定することができました。