PHP вызывает функцию в классе — есть ли более простой способ?

#php #oop #class #function

#php #ооп #класс #функция

Вопрос:

Я очень новичок в ООП и очень плохо разбираюсь в PHP. Мне было интересно, является ли это допустимым методом для вызова функции из класса?

 class newclass {
    public function testfunc {
        return '1';
    }
}
  

Могу ли я назвать это так:

 echo testfunc->newclass();
  

или вот так:

 echo newclass()::testfunc;
  

Я всегда вижу, что это определено в примерах, подобных приведенным ниже, и это казалось дополнительным кодом?:

 $this = new newclass();
$this->testfunc();
echo $this;
  

Любая помощь была бы очень признательна, поскольку я только начинаю разбираться в этой ООП-штуке. Если я пойду на обед, может быть, кто-нибудь подскажет ссылку на действительно хорошее руководство для настоящего новичка в классах / ООП. Спасибо!

Комментарии:

1. php.net/manual/en/language.oop5.php

Ответ №1:

Оба способа работают и имеют свои варианты использования.

Ваш первый случай — это обычный вызов функции с использованием экземпляра класса, ваш второй случай — вызов статической функции.

Статический следует использовать с осторожностью, и его использование очень часто является признаком необходимости рефакторинга / редизайна.

Цель объектно-ориентированного программирования — моделировать мир путем написания классов (чертежей), а затем создавать столько независимых экземпляров этого класса со словом new, сколько необходимо. Каждый экземпляр — это маленький организм с ДНК класса, и вы можете вызывать один и тот же метод класса для каждого отдельного экземпляра, не влияя на другие экземпляры.

Однако статический вызов не связан с экземпляром класса, и поэтому объект не используется. Это глобальный вызов некоторой функциональности инструмента и фактически нарушает идею инкапсуляции.

Итак, я не говорю, что для статических классов и методов нет вариантов использования, но их следует использовать с осторожностью.

Комментарии:

1. «Статический следует использовать с осторожностью, и его использование очень часто является признаком того, что необходим рефакторинг / редизайн» Мне нравится эта строка.

2. Спасибо за подробное объяснение. Я опубликовал вопрос в другом ответе, задаваясь вопросом, подойдет ли статический метод для функции подключения к базе данных в классе db. Каковы ваши мысли / причины?

3. Не имеет смысла, ИМО. Вы хотели бы иметь возможность создавать более одного дескриптора и сохранять экземпляры в реестре или около того.

Ответ №2:

new ключевое слово для создания экземпляра класса. Если вы хотите использовать метод без экземпляра класса, это должен быть статический метод. чтобы иметь статический метод, объявите метод как статический.

 class foo
{
    public static function bar()
    {
        return 'hello!'; 
    }
}
  

Как это использовать?

 echo foo::bar(); //Will print hello
  

Комментарии:

1. Я думаю, вам function где-то там не хватает.

2. Спасибо, я нашел это полезным. Если бы я сказал создать класс базы данных с функцией, подключающейся к базе данных. Я бы, вероятно, сделал это статическим методом?

Ответ №3:

Вы могли бы сделать testfunc static и вызвать его следующим образом:

 class newclass{

  public static function testfunc{

     return '1';
  }
}

echo newclass::testfunc();
  

Нет ничего подобного этому echo testfunc->newclass(); , и делать это так, как

 $class = new newclass();
echo $class->testfunc();
  

это правильный способ сделать это, когда метод является методом экземпляра, а не статическим. Обратите внимание, $this что в статическом методе нет возможности ссылаться.

Ответ №4:

Вы можете создать статическую оболочку для конструктора, которая позволяла бы связывать вызовы методов в одной строке.

 <?php

class ClassA {

     static function create() { return new self(); }

     function method1() { ... }

}


ClassA::create()->method1();
  

Ответ №5:

вы можете включить php-файл, содержащий ваши функции

 <?php
//print.php
function printHello(){
echo "Hello world";
}
?>
  

затем включите его и вызовите функцию…

 <?php
include "print.php";
printHello();

?>
  

Комментарии:

1. Это никоим образом не отвечает на заданный здесь вопрос.