Гэта няправільна, каб стварыць новы асобнік класа з дапамогай статычнага метаду на ім?

Мне было проста цікава аб выкарыстанні статычнага метаду ў PHP. У мяне ёсць клас, які мае публічны статычны метад.

class Dog{
  public static function sound(){
     $bark = "WOOF!";
     return $bark;
  }
}

$new = new Dog(); 
$new->sound();

Яна вяртае Fatal Error. Таму, калі я называю гэты клас. Я стварыў новы асобнік, а затым выклікаць яго, але ён дае мне памылку. Што з'яўляецца аб'ектам, які ён мае на ўвазе? і тое, што з'яўляецца не аб'ект?

Дзякуючы.

абнаўленне: Фатальная памылка: Выклік функцыі-члена на не-аб'ект

2
Існуе не s у вяртанне
дададзена аўтар Mark Baker, крыніца
Там вы ўжо як паўтузіна адказаў пра тое, вы не можаце выклікаць статычны метад з асобнікам класа. Ну, гэта не выклікае якія-небудзь памылкі, папярэджання або апавяшчэнне і кіраўніцтва кажа, што вы можаце!
дададзена аўтар Álvaro González, крыніца
Не ўдаецца прайграць . Скаргі пра памылкі, $ новы не з'яўляецца аб'ектам!
дададзена аўтар Álvaro González, крыніца
Наколькі я ведаю, адзіная памылка выклікана код павінен быць «Памылка сінтаксічнага аналізу: сінтаксічная памылка, нечаканы" $ карай "(T_VARIABLE)» і яго адносіны да ООП. Вы можаце ўдакладніць, якія памылкі вы атрымліваеце, калі вы выправіць памылку друку?
дададзена аўтар Álvaro González, крыніца
Што такое памылка, якую вы атрымліваеце?
дададзена аўтар Lestat, крыніца
Ці з'яўляецца гэта ўвесь код? Я таксама не мог прайграць вашу памылку.
дададзена аўтар Lajos Meszaros, крыніца

7 адказы

Доступ будзе статычны метад:

Dog::sound();

Калі вы не delare свайго гуку() статычны метад, то гэта было б:

$dog = new Dog();
$dog->sound();

Так што ваш код можа быць:

class Dog{
    public static function staticSound(){
        $bark = "WOOF!";
        return $bark;
    }

    public function objectSound(){
        $bark = 'Woof';
        return $bark;
    }
}

$dog = new dog(); 
echo $dog->objectSound();
echo Dog::staticSound();
4
дададзена
@ MészárosLajos - Правільна, гэта супрацьлеглая рэч, якая не дапускаецца, бо ён можа не працаваць (напрыклад, калі выклікі метаду $ гэта ).
дададзена аўтар Álvaro González, крыніца
@ MészárosLajos - Ці можаце вы даць код, які выклікае, што строгае папярэджанне вы кажаце? Я быў не ў стане атрымаць любую памылку, папярэджанне або апавяшчэнне.
дададзена аўтар Álvaro González, крыніца
@ MészárosLajos +1, гэта праўда, што гэта выклікае ў мяне блытаніна часам!
дададзена аўтар Phil Cross, крыніца
На жаль, ваш код працуе выдатна, проста тэставаў пад PHP 5.4, я змешвала яго пры выкліку нон статычнага метаду як статычныя ў инстанциирован аб'екта. <�Код> ini_set ( 'display_errors', 1); error_reporting (E_ALL); клас Dog {функцыя гукавой грамадская() {$ кара = "Гаў!"; вярнуць $ кары; }} $ = Новы новы Dog (); Рэха $ новы :: гук (); Строгія стандарты: Non-статычны метад Dog :: гук() не варта зваць статычна
дададзена аўтар Lajos Meszaros, крыніца
На жаль, PHP не хвалюе, калі вы выклікаеце статычны метад з -> да таго часу, пакуль аб'ект будзе инстанциирован да PHP версіі 5.4 Акрамя таго, у 5.4, ён будзе вырабляць толькі строгае папярэджанне, а не фатальнай памылкай.
дададзена аўтар Lajos Meszaros, крыніца
@Phil Крыж: вялікі дзякуй. Я павінен выкарыстоўваць (: :) для гэтага.
дададзена аўтар ladybug, крыніца

Вы не можаце выклікаць статычны метад на рэалізаваны аб'екце вы павінны выклікаць яго ў вашым прыкладзе, як, што:

Dog.sound();

Гэта шлях статычны метад выкарыстоўваецца на большасці мовы сайта

3
дададзена
Гэта не адносіцца да аб'екта ... ён статычны да класа азначае, што не мае доступу да метадаў асобніка або ўласцівасці.
дададзена аўтар Orangepill, крыніца
@ladybug я не адсылаю вас да php.net, я адказваў, што, таму што адказ быў няправільным, статычныя метады выклікаюцца з дапамогай аператара дазволу вобласці бачнасці (: :)
дададзена аўтар mishu, крыніца
дададзена аўтар mishu, крыніца
@mishu: гэта тое, што я думаў, што некаторыя з вас перадаць мне php.net. Я спытаў у яго тут, таму што адказы прасцей.
дададзена аўтар ladybug, крыніца
@ User2417992: Прывітанне, што аб'ект, які ён мае на ўвазе? Я пачатковец у класе, што і ўсё. дзякуй.
дададзена аўтар ladybug, крыніца
Як ваш метад з'яўляецца статычным вы можаце выклікаць яго з дзе вы хочаце без вы павінны зрабіць аб новым экзэмпляры класа, так што калі ў вас ёсць клас А з статычным метадам Ь() вы заўсёды будзеце называць яго Ab (), або у PHP A :: B ()
дададзена аўтар user2417992, крыніца

Статычныя метады ў PHP называюцца наступным чынам:

Dog::sound();

розніца паміж статычнымі і ня статычнымі метадамі з'яўляецца тое, што статычны метад не мае доступу да гэтай зменнай $. Акрамя таго, статычныя метады выклікаюцца на класа і няма на <�моцны> Асобнік гэтага класа.

Заўвага: Вы можаце атрымаць толькі фатальную памылку, таму што ў вас ёсць памылка друку ў зваротным заяве - ваш сінтаксіс будзе accually работы, таму што PHP вельмі даравальна, і будзе <�моцнага> дазволіць , каб выклікаць статычны метад у нестатическом шлях.

2
дададзена
Статычныя метады таксама могуць быць выкліканыя на асобнік класа. Там няма нічога, што прадухіліць гэта ад працы.
дададзена аўтар Álvaro González, крыніца
Разумею. Гэта мела сэнс. :)
дададзена аўтар ladybug, крыніца

У PHP вы павінны выклікаць статычныя метады ў класе, а не на экзэмпляры. Гэта на самай справе мяняецца на ААП мове - некаторыя робяць гэта дазволіць, так што блытаніна зразумела, але прычына PHP не проста таму, што ён не мае строгай тыпізацыі, пры гэтым не дазваляючы кампілятару бяспечна вызначыць тып <�код > $ сабака падчас выкліку.

Правільны сінтаксіс Dog :: гук() .

1
дададзена
Вы павінны? Кіраўніцтва не кажа так, і калі вы яго выкарыстоўваеце гэта працуе.
дададзена аўтар Álvaro González, крыніца

If $new->sound(); triggers Call to a member function on a non-object it means that you are attempting to call a member function (sound()) on something that is not an object ($new). That's the real problem and it cannot be triggered by the code you've posted. I'm pretty sure that you get that error in your real code but you've posted a simplified version that doesn't reproduce the issue.

Спрошчаны код Вы размясцілі павінны працаваць нармальна, за выключэннем таго, што, вядома, не друкуе або выкарыстоўваць вяртаецца значэнне. З невялікім выпраўленнем мы можам бачыць, што абодва спосабу выклікаць статычны метад справядлівы:

<?php

error_reporting(-1);

class Dog{
  public static function sound(){
     $bark = "WOOF!";
     return $bark;
  }
}

$new = new Dog();
echo Dog::sound();
echo $new->sound();

Паглядзець у дзеянні .

The manual might not say it explicitly but implicitly confirms it can be done:

<�Р> Дэклараванне ўласцівасці або метады класа як статычныя робіць іх даступнымі   без жыве ў нястачы Канкрэтызацыя класа.
  [...]
Паколькі статычныя метады могуць быць адкліканыя без асобніка з   створаны аб'ект, псеўда-зменная $ гэта не бачным у   Метад абвешчаны як статычны. </Р>

Не будучы абавязковым з'яўляецца не тое ж самае, як быць забаронена.

Static properties cannot be accessed through the object using the arrow operator ->.

Ўласцівасці, а не метады.

<�Р> Выклік <�моцныя> нестатические </> моцныя метады статычна генеруе ўзровень E_STRICT   папярэджанне.

Гэта супрацьлеглая рэч, якая выразна дакументаваны як нявырашанае

1
дададзена
Г. вікарыем: вау, дзякуй!
дададзена аўтар ladybug, крыніца

Гэта добра, каб стварыць асобнік класа, які рэалізуе статычны метад.

Гэта проста незаконна выклікаць гэты метад статычны.

каб выклікаць статычны метад, які вы будзеце выкарыстоўваць

Dog::sound();

І ў Dog :: гук $ гэта не будуць даступныя, таму што вы выклікаеце яго на класе, а не да экземпляра.

Для бонуса статычныя метады могуць быць выкліканыя:

з класа, як

self::sound();
static::sound();

З пашырыць клас як

static::sound();

З Anywhere, як

$a = array("Dog","sound");
$a();

call_user_func($a);

$d= "Dog"; $s = "Sound";
$d::$s();

$d = new Dog();
$d->sound();
1
дададзена
Што менавіта робіць $ новый-> гук() незаконным?
дададзена аўтар Álvaro González, крыніца
Вы можаце прайграць, што ў PHP скрыпцы вашага выбару?
дададзена аўтар Álvaro González, крыніца
Я быў няправы ... папярэджанне я думаў, калі вы тэлефануеце нестатическую функцыю ў статычным кантэксце.
дададзена аўтар Orangepill, крыніца
У PHP 5.4 ён генеруе папярэджанне
дададзена аўтар Orangepill, крыніца

Вы можаце выклікаць статычны метад з асобніка, як гэта:

$dog = new Dog();
$dog::sound();

Але вы павінны выклікаць статычныя метады, як гэта

Dog::sound();

See: http://www.php.net/manual/en/language.oop5.static.php

1
дададзена
<�Код> $ новый-> гук() працуе проста выдатна. Паспрабуйце гэта!
дададзена аўтар Álvaro González, крыніца
Калі я правільна памятаю, метады не могуць быць дакладна вызначаны як статычныя , перш чым PHP/5 </а >. Так што я б сказаў, што $ новый-> гук() дзейнічае з ООП дасягнула PHP ;-)
дададзена аўтар Álvaro González, крыніца
Так, гэта падобна на працу, так як PHP 5.0.0. Але я dont't думаю, што гэта можна лічыць добрым стылем праграмавання. Акрамя таго, гэта не мае зваротнай сумяшчальнасці з PHP версіі ніжэй 5.0.0.
дададзена аўтар sirius, крыніца
Так, вы маеце рацыю. Мая віна.
дададзена аўтар sirius, крыніца