Как сделать вызов функции из другой функции php?
Вызов функции из другой функции в PHP можно сделать с помощью круглых скобок:
function firstFunction() echo 'This is the first function!'; > function secondFunction() firstFunction(); > secondFunction(); // => This is the first function!
А также можно сделать с помощью функции call_user_func()
Вызывает callback-функцию, переданную первым параметром, и передаёт остальные параметры в качестве аргументов.
function firstFunction() echo 'This is the first function!'; > function secondFunction() call_user_func('firstFunction'); > secondFunction(); // => This is the first function!
Вызвать метод внутри метода
Hello world! В общем суть такова: есть класс admin, который содержит метод: news, внутри которого содержатся методы: addNews,editNews,delNews.. И вот: как внутри метода news() вызвать его подметод — addNews()?
Код примерно такой:
class News { private $result; function news() { $this->result = 'КАК ВОТ ТУТ ВЫЗВАТЬ МЕТОД addNews();' //p.s. $this->result = $this->getNews(); не помогает function addNews() { return "trololo"; } } }
Объект внутри объекта / метод внутри метода
Салам, братва. Я вроде как новичок в ООП. Не подскажите, что это такое в плане конструкции и где.
Как правильно описать метод внутри другого метода одного и того же класса?
Извияюсь за возможно глупый вопрос, но ООП тема для меня новая.Вот так выглядел метод класса в.
Как правильно вызвать метод класса внутри самого класса?
Здравствуйте. Собственно тема прописана в заголовке: как правильно вызвать метод класса внутри.
Переопределение метода __call() чтобы вызвать методы protected с экземпляры класса
Я пришел на новый проект и столкнулся с такой ситуацией, что там сделали возможным вызывать методы.
1 2 3 4 5 6 7 8 9 10 11 12
class News { private $result; public function news() { $this->result = $this->getNews(); } public function getNews() { return []; } }
Jodah, есть ещё понятие как функция в функции, что я и пытаюсь сделать: сделать общий метод news, который внутри себя содержит остальные методы (addNews, editNews, delNews).. В том то и дело конечно, что данный приём у меня получался только при работе с функциями (процедурном стиле), а в ООП я вот только сейчас пробую сделать, и пока не выходит.. В гугле тоже ничего.. Т.е. по сути я прихожу к выводу, что в ООП такая возможность не предусмотрена.. Может Вы знаете по этому поводу?
Сообщение от Linked
Вообще есть анонимные функции:
$greet = function($name) { echo("Hello $name"); }; $greet('World'); $greet('PHP');
Как вызвать внутри метода одного класса метод другого класса в php?
Ошибка:
Call to a member function name1() on null in.
Работает только в том случае, если я инициализирую класс внутри метода name2().
require_once ROOT . '/app/core/db.class.php'; // в нем же создается объект класса $DB = new DataBase(); require_once ROOT . '/app/core/user.class.php'; // в нем же создается объект класса $USER = new User(new DataBase); require_once ROOT . '/app/core/auth.php'; // здесь вызываю $USER->name2();
короче так должно быть:
$user = new User(new DataBase());
$db = new DataBase(); $user = new User($db);
Максим Федоров,
зависимостей никаких нет, я имел ввиду, что создаю объект класса DataBase ($DB) вне класса User.
Сделал все так, как у Вас написано, не помогло(
а как создаете объект User?
Максим Федоров,
как обычно, все из-за невнимательности.
Вы мне очень помогли! Благодарю!
P.S. посмотрите как я создаю конструктор (тело вопроса).
lexstile, хм, я наткнулся на эту очепятку при первом запуске,
но подумал вы ее во время печатания тут в вопросе сделали 🙂
Максим Федоров,
к сожалению, нет, я искал решение и скопировал данный код с какого-то сайта, заменив только названия свойства и класса. Даже не обратил внимания, что редактор не подсвечивает конструктор.
Потом начал тестировать Ваш код, сначала на одной странице, затем сделал все, как у меня — и код сработал, тут я и понял, в чем дело)
Еще раз спасибо, просто спасли)
Тебе написано: Call to a member function name1() on null, это значит что в поле $this->db значение $this->db. $this->db, у тебя, инициализируется в конструкторе класса значение из параметра $DB. Это значит, что в $DB тоже null. И вот теперь думай, почему в твой класс передается null, вместо объекта класса DataBase.
Функции внутри методов или использовать приватные методы?
Добрый день! Как правильно спроектировать код в ООП стиле.
Поместить функцию внутрь метода, к примеру вот так:
class MyClass { public function calcSize ($length) { function makeSomething($lenght){ . } . calc something. $important_value = makeSomething($length); . calc something. return $some_variable; } }
или функции function makeSomething($lenght) вынести в отдельный приватный метод, то есть вот так:
class MyClass { private function makeSomething($lenght){ . } public function calcSize ($length) { . calc something. $important_value = makeSomething($length); . calc something. return $some_variable; } }
Функции внутре методов понравилось делать после JS, там весьма удобно удобно все реализовывется. Прошу просвятить меня, как правильно делать.
Будет ли корректным вызывать внутри методов get или set другие функции или менять свойства контролов?
Всем привет. Скажите разрешается, не в том смысле, что понятно все разрешено, а будет ли.
AsyncTask. Можно ли использовать методы return внутри?
При том что они нужны только для другого метода? Или придется либо в один метод всё поместить или.
ООП в VBA: Можно ли использовать методы класса внутри его самого
Интересует: является ли это хорошим стилем программирования, или это приведет к проблемам? .
Сообщение от auditseo
Сообщение от auditseo
auditseo, Оба примера отличаются только тем, что в первом метод makeSomething открытый (public по умолчанию), а во втором закрытый. А как правильно зависит от того, должен ли метод быть виден пользователю, либо он только для внутреннего пользования, должны ли видеть его потомки (protected)
Сообщение от Jewbacabra
Оба примера отличаются только тем, что в первом метод makeSomething открытый (public по умолчанию), а во втором закрытый. А как правильно зависит от того, должен ли метод быть виден пользователю, либо он только для внутреннего пользования, должны ли видеть его потомки (protected)
Эм. В первом случае makeSomething() это вообще не метод (тем более не публичный). Это простая функция, область видимости которой — метод MyClass::calcSize().
Сообщение от auditseo
Функции внутре методов понравилось делать после JS, там весьма удобно удобно все реализовывется. Прошу просвятить меня, как правильно делать.
Метод класса php внутри метода
Если я хочу получить доступ к публичному методу, я могу сделать это легко. Но если я хочу получить доступ к свойству внутри метода, что мне делать, и рекомендуется ли это?
Могу ли я сделать что-то подобное в php?
и чем в каком-то другом месте
$auth = new Auth(); $auth->check('user1')->project;
Просто, чтобы вы, люди, знали, что это возможно, вот Zend framework код из
if ($result->isValid()) < $this->getStorage()->write($result->getIdentity()); >
6 ответов
Я полагаю, что ваш вопрос в основном касается плавных интерфейсов или объединения методов в сочетании с магическим методом. __get
project = 1; > > > $auth = new Auth(); $auth->check('user1')->project;
Примечание: попытка получить свойство необъекта в /in/Hi5Rc в строке 13
так как $auth->check(‘user1’) возвращает NULL (или void) и NULL не имеет project имущество.
Первое, что нам нужно, это для $auth->check(‘user1’) вернуть что-то полезное. При условии $project является логическим и $this->project целое число, имеет смысл просто вернуть $project и получить значение.
project = 1; > return $project; > > $auth = new Auth(); print_r($auth->check('user1'));
Но это не решает ваш вопрос о том, как получить свободный доступ к непубличному полю или параметру.
Похоже, что вы работаете под неправильным представлением о том, что эти проекты используют такие переменные, как $project в вашем check() класс и сделать их доступными. Они не.
Поле $storage сам по себе защищен, но у него есть публичные (беглые) методы получения / установки.
Так, $this->getStorage() возвращает экземпляр new Storage\Session() который имеет общественность write() ,
таким образом $this->getStorage()->write() работает.
Итак, давайте возьмем ваш пример класса и немного изменим его, чтобы продемонстрировать.
name = $name; $this->active = $active; $this->description = $description; > /** * @param string $name * * @return Project */ public function setName(string $name): Project < $this->name = $name; return $this; > /** * @param bool $active * * @return Project */ public function setActive(bool $active): Project < $this->active = $active; return $this; > /** * @param string $description * * @return Project */ public function setDescription(string $description): Project < $this->description = $description; return $this; > /** * @return string */ public function getName(): string < return $this->name; > /** * @return bool */ public function isActive(): bool < return $this->active; > /** * @return string */ public function getDescription(): string < return $this->description; > public function toArray() < return [ 'name' =>$this->name, 'active' => $this->active, 'description' => $this->description ]; > public function toJson()< return json_encode($this->toArray()); > public function __toString() < return $this->toJson(); > > class Auth < /** * @var Project */ private $project; public function __construct($project = Null) < $this->project = is_null($project)? new Project() : $project; > public function check($user = false)< if($user == 'user1')< $this->project->setName("Project: $user")->setActive(true)->setDescription("This project belongs to $user"); > return $this; > /** * @param Project $project * * @return Auth */ public function setProject(Project $project): Auth < $this->project = $project; return $this; > /** * @return Project */ public function getProject(): Project < return $this->project; > > $auth = new Auth(); echo $auth->check('user1')->getProject();
Однако вы хотели получить доступ к закрытому полю, как если бы оно было открытым, без использования определенного метода получения / установки. Итак, давайте внесем еще некоторые изменения в Auth учебный класс.
class Auth < /** * @var Project[] */ private $private_project; public function __construct($project = Null) < $this->private_project = is_null($project)? new Project() : $project; > public function check($user = false)< if($user == 'user1')< $this->private_project->setName("Project: $user")->setActive(true)->setDescription("This project belongs to $user"); > return $this; > public function __get($name) < if ($name === 'project')< return $this->private_project; > > >
Теперь вы можете свободно получить доступ к полю, как вы просили:
$auth = new Auth(); echo $auth->check('baduser')->project; echo "\n"; echo $auth->check('user1')->project;
Eloquent модели Laravel широко используют __get() функция для динамического доступа к полям модели. Laravel также широко использует __call() магический метод для беглости.
Я надеюсь, что это поможет внести некоторую ясность.