#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:
Оба способа работают и имеют свои варианты использования.
Ваш первый случай — это обычный вызов функции с использованием экземпляра класса, ваш второй случай — вызов статической функции.
Статический следует использовать с осторожностью, и его использование очень часто является признаком необходимости рефакторинга / редизайна.
Цель объектно-ориентированного программирования — моделировать мир путем написания классов (чертежей), а затем создавать столько независимых экземпляров этого класса со словом 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. Это никоим образом не отвечает на заданный здесь вопрос.