ホームページ バックエンド開発 PHPチュートリアル PHP で非静的メソッドを静的に呼び出すことはできますか? (変な電話)

PHP で非静的メソッドを静的に呼び出すことはできますか? (変な電話)

Jul 30, 2016 pm 01:30 PM
nbsp php test

1. PHP では非静的メソッドを静的に呼び出すことができますか?

今日は、PHP で className::methodName() メソッドを使用して、静的として宣言されていないメソッドを呼び出すことができるかどうかを尋ねられました。私の心の中では、この用法を以前に見たような気がしますが、少し自信がありません。ご存知のとおり、マニュアルやチュートリアルでは、メソッドは静的メソッドと非静的メソッドに分けられます。通常、静的に呼び出すメソッドは静的メソッドでなければなりません。

非静的メソッドを呼び出すとどうなるでしょうか?まずテストを行ってください。

11 <?php

2classtest{

3 functiontest() {

4 echo'it works';

5 }

6}

7test::test();

8?>

执行以下,返回错误如下:

1 Fatal error: Non-static method test::test() cannot be called statically in /home/×××/test.php

2 on line 7 Call Stack: 0.0002 332548 1. {main}() /home/×××/test.php:0

这个时候,可能大家就会认为静态调用非静态方法是行不通的了,但其实,结论下的过早了,因为test()这个方法比较特殊,与类同名,是构造方法。 我们继续测试。

01 <?php

02classtest {

03 functiontest() {

04 echo'it works';

05 }

06 functiontest2() {

07 echo'it works too';

08 }

09}

10test::test2();

11?>

执行结果:

1 it works too

这说明,静态调用非静态方法是可行的,但是静态调用构造方法是不可以的。为了验证这个结论,我又做了如下测试:

1 <?php

2classtest{

3 staticfunctiontest() {

4 echo'it works';

5 }

6}

7test::test();

<?php
8?>
🎜🎜🎜🎜🎜🎜🎜2🎜🎜<コード>クラステスト{🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜3🎜🎜 関数</code ><code>test() {🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜4🎜🎜 echo 「うまくいきます」;🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜5🎜🎜 }</code > code>test::test();🎜🎜🎜🎜🎜🎜🎜8🎜🎜?>🎜🎜🎜🎜🎜 🎜🎜 🎜以下を実行すると、返されるエラーは次のとおりです: 🎜🎜🎜🎜🎜🎜🎜🎜1🎜🎜致命的なエラー: 非静的メソッド test::test() は実行できません/home/ ×××/test.php🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜2🎜🎜行 7 で静的に呼び出されます 呼び出しスタック: 0.0002 332548 1. {main}() / home/×××/test.php:0🎜🎜🎜🎜🎜🎜🎜🎜現時点では、非静的メソッドを静的に呼び出すことは不可能だと思われるかもしれませんが、実際にははい、test() メソッドはクラスと同じ名前を持ち、コンストラクター メソッドであるため、結論を出すのは時期尚早です。 テストを続けましょう。 🎜🎜🎜🎜🎜🎜🎜🎜01🎜🎜<?php🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜02🎜🎜<コード>クラステスト{🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜03🎜🎜 関数</code ><code>test() {🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜04🎜🎜 echo 「うまくいきます」;🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜05🎜🎜 }</code >🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜<code>06🎜🎜 functiontest2() {🎜🎜🎜 - code>🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜08🎜🎜 }🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜 09🎜🎜}🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜10🎜🎜test::test2(); 🎜 🎜🎜🎜🎜🎜🎜🎜🎜🎜11🎜🎜?>🎜🎜🎜🎜🎜🎜🎜🎜 実行結果: 🎜🎜🎜🎜1🎜🎜それも動作します🎜🎜🎜🎜🎜🎜🎜🎜 これは、非静的メソッドの静的な呼び出しは可能ですが、コンストラクターの静的な呼び出しは不可能であることを示しています。 /u>。この結論を検証するために、次のテストを実行しました。 🎜 🎜2🎜🎜classtest{🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜3🎜🎜 staticfunctiontest() {🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜4 🎜🎜 echo「うまくいきます」;🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜 5 🎜🎜 }🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜6🎜🎜} 🎜 🎜🎜🎜🎜🎜🎜🎜🎜🎜7🎜🎜test::test();🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜8コード >🎜🎜?>🎜🎜🎜🎜

実行結果は次のとおりです:

1 Fatal error: Constructor test::test() cannot be static in /home/xxx/test.php on line 9

构造方法不能声明静态,所以上面的推论正确。

但这个结果的确是很特殊的,因为可能只有PHP可以静态调用非静态方法,我用Java做了实验,如果静态调用非静态方法会报如下错误:

1 Cannot make a static reference to the non-static method showString() from the type HelloWorldApp

其他语言我没有一一尝试,但这已经足够来说明PHP的特殊之处,关于为什么PHP会有这样的情况我暂时没有找到相关说明。

2.静态调用非静态方法是否应该被应用?

那我们是不是可以使用这种方法来代替static方法呢? 首先在代码的可读性上来看,静态调用非静态方法当然是不被推荐的,这会让维护者产生疑惑。

接下来我们再做一些实验,来看一下静态调用非静态方法在效率上是否会有一定的优势。

1 <?php

2classtest{

3 functiontest2() { }

4}

5

6for($k1$k<10000; $k&#43;&#43;) {

7 test::test2();

8}

9?>

上面代码在我这里的执行时间是18到28毫秒,我们再来测试标准的写法。

1 <?php

2classtest{

3 staticfunctiontest2(){ }

4}

5

6for($k致命的なエラー: コンストラクター test::test() は /home/xxx/test.php の 9 行目で静的であることはできません$k<10000; $k&#43;&#43;) {

7 test::test2();

8}

9?>

上面的代码执行时间在5到10毫秒之间,这样看来,静态调用非静态方法的效率要比标准的静态方法调用低的多,所以在效率上也不推荐静态调用非静态方法


发现WordPress中居然在用这么诡异的调用方式:

class-wp.php 第 206-207行:
// Substitute the substring matches into the query.
$query = addslashes(WP_MatchesMapRegex::apply($query, $matches));

这里用的静态调用,而实际的成员函数却不是静态的。


注意:PHP不能静态调用非静态属性

1 <?php

2classtest{

3 var$id= '123';

4 functiontest2() {
🎜🎜🎜 コンストラクターは静的に宣言できないため、上記の推論は正しいです。 🎜🎜しかし、この結果は確かに非常に特殊です。なぜなら非静的メソッドを静的に呼び出せるのは PHP だけであるからです。Java で実験を行ったところ、非静的メソッドを静的に呼び出すと次のエラーが発生します。報告される:🎜🎜🎜1🎜🎜🎜🎜キャノットタイプのhelloworldapp🎜🎜🎜🎜🎜🎜🎜🎜🎜iのshontring()をshontaticメソッドに静的に参照してくださいPHP の特殊な機能を説明するにはこれで十分ですが、なぜ PHP がそのような状況になるのかについての適切な説明は見つかりませんでした。 🎜🎜2. 非静的メソッドへの静的呼び出しを適用する必要がありますか? 🎜🎜静的メソッドの代わりにこのメソッドを使用できますか? まず、コードの可読性の観点から、非静的メソッドを静的に呼び出すことは当然推奨されませんので、メンテナーが混乱することになります。 🎜🎜 次に、非静的メソッドを静的に呼び出すことに効率性の点で利点があるかどうかを確認するために、いくつかの実験を行ってみましょう。 🎜🎜🎜🎜🎜🎜🎜🎜🎜1🎜🎜🎜🎜<?php🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜2🎜🎜🎜 🎜クラス🎜🎜テスト{🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜 🎜🎜3🎜🎜🎜🎜 🎜🎜function🎜🎜test2() { }🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜4🎜🎜🎜🎜} 🎜 🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜5🎜🎜 🎜 🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜6🎜🎜🎜🎜for🎜🎜(🎜🎜$k🎜🎜=0; 🎜🎜$k🎜🎜<10000; 🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜7🎜🎜🎜🎜🎜 🎜test::test2();🎜🎜🎜🎜 🎜🎜🎜🎜🎜🎜🎜🎜8🎜🎜🎜🎜}🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜9🎜🎜🎜🎜?> 🎜🎜🎜🎜🎜🎜🎜🎜🎜上記のコードの実行はここです時間は 18 ~ 28 ミリ秒です。標準的な書き込み方法をもう一度テストしてみましょう。 🎜🎜🎜🎜🎜🎜🎜🎜🎜1🎜🎜🎜🎜<?php🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜2🎜🎜🎜 🎜クラス🎜🎜テスト{🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜 🎜🎜3🎜🎜🎜🎜 🎜🎜static🎜🎜function🎜🎜test2(){ }🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜4🎜🎜 🎜 🎜}🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜 5🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜6🎜🎜🎜🎜for🎜🎜(🎜🎜$k🎜🎜=0; 🎜🎜$k🎜🎜<10000; 🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜7🎜🎜🎜🎜 🎜テスト: :test2();🎜🎜🎜🎜 🎜🎜🎜🎜🎜🎜🎜🎜8🎜🎜🎜🎜}🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜9🎜🎜🎜🎜?> 🎜🎜🎜🎜🎜🎜🎜🎜🎜上記のコードの実行時間は5ですこの観点から、非静的メソッドの静的呼び出しの効率は標準の静的メソッド呼び出しよりもはるかに低いため、 という観点からは非静的メソッドの静的呼び出しは推奨されません。効率。 🎜
🎜WordPress が実際にこのような奇妙な呼び出しメソッドを使用していることを発見しました: 🎜
🎜class-wp.php 行 206-207: 🎜
// 部分文字列の一致をクエリに置き換えます。
$ query = addedlashes(WP_MatchesMapRegex::apply($query, $matches));
🎜ここでは静的呼び出しが使用されていますが、実際のメンバー関数は静的ではありません。 🎜
🎜注: PHP は非静的プロパティを静的に呼び出すことはできません🎜
🎜🎜🎜🎜🎜🎜🎜🎜1🎜🎜🎜🎜<?php🎜🎜🎜🎜🎜🎜🎜 🎜🎜🎜 🎜 2🎜🎜🎜🎜クラス🎜🎜テスト{🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜3🎜🎜🎜🎜 🎜🎜=」 123分🎜🎜;🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜 🎜🎜4🎜🎜🎜🎜 🎜🎜関数🎜🎜test2() {🎜🎜🎜🎜🎜

55 echo'it works';

6 }

7}

8echotest::$id;

9?>

报错:

echo「うまくいきます」;
1 Fatal error: Access

🎜🎜🎜6🎜🎜 }🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜7🎜🎜<code>}🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜8🎜🎜echotest::$id;🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜9🎜🎜?>🎜🎜 🎜🎜🎜🎜🎜🎜エラー: 🎜🎜🎜🎜🎜1🎜🎜致命的なエラー: アクセス🎜🎜🎜🎜 🎜 上記は、PHP で非静的メソッドを静的に呼び出すことができるかどうかを紹介しました。 (変な呼び方) 内容の側面も含めて、PHP チュートリアルに興味のある友人の参考になれば幸いです。 🎜 🎜 🎜
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles