- Погружение в Closure и анонимные функции в PHP
- Что такое анонимная функция?
- Что такое замыкание в PHP?
- На пути понимания этого
- Некоторые факты об этом классе
- Небольшое пояснение
- Какая польза?
- Некоторые практические варианты использования
- Заключение
- Класс Closure
- Обзор классов
- User Contributed Notes 4 notes
- php — Object of class Closure could not be converted to string in laravel
- Answer
- Solution:
- Share solution ↓
- Additional Information:
- Didn’t find the answer?
- Similar questions
- Write quick answer
- About the technologies asked in this question
- PHP
- Laravel
- MySQL
- HTML
- Welcome to programmierfrage.com
- Get answers to specific questions
- Help Others Solve Their Issues
Погружение в Closure и анонимные функции в PHP
Замыкания и анонимность — это то, что мне было трудно изучить во всей экосистеме PHP, не потому, что я, вероятно, сошел с ума, а потому, что нет хорошего и подробного объяснения того, что именно они собой представляют и как их можно использовать.
Я решил покопаться и посмотреть, смогу ли я понять, что такое замыкания в PHP. Здесь я поделюсь с вами, как я это сделал и что я нашел. Хотя мой метод может показаться некоторым из вас ненаучным, я попробовал личную процедуру, на оттачивание которой у меня не ушло много времени.
Что такое анонимная функция?
Безымянная функция . _ Анонимная функция выглядит так:
В отличие от обычных функций, анонимная функция не имеет имени.
Теперь представьте, если вы хотите использовать анонимную функцию, как вы это сделаете? в основном (можно использовать в функциях первого класса) это невозможно сделать. Итак, чтобы помочь в этом, реализована привязка имени, позволяющая хранить всю анонимную функцию в файле variable . Когда это сделано, это variable становится тем, что называется Closure
Что такое замыкание в PHP?
Класс , который ( тип ) используется для представления анонимной функции . Это может звучать очень странно, в PHP есть встроенный класс Closure . Когда создается анонимная функция, ее тип автоматически равен object(Closure) . Помните о динамической типизации PHP. Вот почему на практике Closure является анонимной функцией .
Чтобы доказать это, попробуйте следующее:
Переменная , содержащая анонимную функцию
Когда анонимная функция связана с переменной, эта переменная становится объектом класса Closure , следовательно, также является функцией Closure/anonymous .
На пути понимания этого
Во-первых, попробуйте создать объект/экземпляр класса Closure .
PHP Catchable fatal error: Instantiation of 'Closure' is not allowed
- Класс Closure не предназначен для создания экземпляров; его конструктор имеет значение private .
- Класс ничего не возвращает и не имеет параметров.
Некоторые факты об этом классе
- У него всего 5 методов: __construct() , __invoke() , bindTo() , call() , bind()
- Метод __construct() существует только для того, чтобы запретить создание экземпляра класса
- Это точно не интерфейс
- Класс является окончательным
Небольшое пояснение
Нам не нужно создавать экземпляр Closure , так как PHP делает это каждый раз, когда функция создается без имени, поэтому теперь я могу сделать:
Проблема как его так использовать??
Решение, создайте переменную и сохраните функцию, затем, используя переменную, мы вызываем функцию:
$closureFunction = function() < return true; >; //never forget this semi-colon
Теперь, поскольку это (выглядит) как переменная, мы должны иметь возможность использовать ее разными способами, например, повторяя ее, используя ее в качестве параметра функции или свойства класса и т. д.
echo $closureFunction; // PHP Catchable fatal error: Object of class Closure could not be converted to string;
— Как функция
echo test($closureFunction); //PHP Catchable fatal error: Object of class Closure could not be converted to string
Независимо от того, где вы пытаетесь echo это сделать, вы всегда будете получать эту ошибку. Чтобы доказать это, давайте var_dump посмотрим, что мы пытаемся повторить:
var_dump($closureFunction); var_dump(test($closureFunction));
object(Closure)#1 (0) < >object(Closure)#1 (0)
Переменная, содержащая нашу nameless функцию, на самом деле содержит объект типа Closure .
Что произошло, как функция превратилась в объект?
Прежде чем я отвечу, давайте копнем дальше, установив параметр функции:
$closureFunction = function($var) < return $var; >; function test($var) < return $var; >var_dump($closureFunction); // object(Closure)#1 (1) < ["parameter"]=>array(1) < ["$var"]=>string(10) "" > > var_dump($closureFunction('ok')); // string(2) "ok" echo($closureFunction('ok')); // ok var_dump(test($closureFunction)); //object(Closure)#1 (1) < ["parameter"]=>array(1) < ["$var"]=>string(10) "" > > var_dump(test($closureFunction('ok'))); // string(2) "ok" var_dump(test($closureFunction($closureFunction))); // object(Closure)#1 (1) < ["parameter"]=>array(1) < ["$var"]=>string(10) "" > >
Отсюда пока:
- функция nameless находится в переменной
- мы можем использовать его где угодно, так как можно использовать переменную, кроме ее повторения
- функция становится объектом класса Closure
Объяснение магии:
- Тот факт, что класс Closure реализует __invoke , означает, что мы можем вызывать его экземпляры как вызов функции, например $var() . Если this: $var = function()<>; является объектом Closure , он позволяет нам использовать его $var с таким параметром, как $var($parameter) . В этом случае класс называется вызываемым .
- Замыкания считаются первоклассными типами значений , как и string or integer . Это на самом деле секрет. Закрытие — это тип, определенный в движке PHP как тип, и вы не видите, когда именно они генерируются.
Какая польза?
Их использование зависит в основном от вашего варианта использования и потребностей. Тем не менее, вы можете использовать их как:
— Callables/Callback работают следующим образом:
$items = [1, 2]; $closure = function($x, $y)< echo __FUNCTION__, " got $x and $y"; >; call_user_func_array ($closure , $items );
— Наследование переменных , подобное этому:
$msg = 'Hello'; $closure = function () use ($msg) < var_dump($msg); >; $closure();
— Присвоение переменной
$eat = function($food)< echo "I am eating some ", $food."
"; >; $eat('Bananas'); $eat('Apples');
— чтобы прикрепить состояние следующим образом:
function brand($name) < return function ($slogan) use ($name)< return sprintf('%s : %s', $name, $slogan); >; > $brand = brand('Dell'); print $brand('The power to do more.');
$recursive = function () use (&$recursive) < return $recursive; >; print_r($recursive());
Некоторые практические варианты использования
- В большинстве современных фреймворков замыкания используются для маршрутизации.
- Закрытие также используется при разработке корзин для покупок.
Заключение
Это было исследование закрытий PHP. Надеюсь, вы были достаточно близки с ними. Анонимные функции всегда сложны для понимания и использования.
Что вы должны знать сейчас, так это то, что каждый раз, когда у вас возникает случай/проблема, просто помните и спрашивайте себя, могут ли замыкания быть очень полезными. Вы будете удивлены, как они облегчат вашу жизнь.
Я также признаю, что не могу сказать/объяснить все. Если у вас есть плюс, пожалуйста, добавьте его под этим уроком в качестве комментария. Спасибо за чтение.
Класс Closure
Класс, используемый для создания анонимных функций.
Анонимные функции выдают объекты этого типа. Класс получил методы, позволяющие контролировать анонимную функцию после её создания.
Кроме методов, описанных здесь, этот класс также имеет метод __invoke . Данный метод необходим только для совместимости с другими классами, в которых реализован магический вызов, так как этот метод не используется при вызове функции.
Обзор классов
public static bind ( Closure $closure , ? object $newThis , object | string | null $newScope = «static» ): ? Closure
User Contributed Notes 4 notes
This caused me some confusion a while back when I was still learning what closures were and how to use them, but what is referred to as a closure in PHP isn’t the same thing as what they call closures in other languages (E.G. JavaScript).
In JavaScript, a closure can be thought of as a scope, when you define a function, it silently inherits the scope it’s defined in, which is called its closure, and it retains that no matter where it’s used. It’s possible for multiple functions to share the same closure, and they can have access to multiple closures as long as they are within their accessible scope.
In PHP, a closure is a callable class, to which you’ve bound your parameters manually.
It’s a slight distinction but one I feel bears mentioning.
Small little trick. You can use a closures in itself via reference.
Example to delete a directory with all subdirectories and files:
php — Object of class Closure could not be converted to string in laravel
Object of class Closure could not be converted to string in laravel, i am trying get post by month and year
public function getPostsByArchive($slug) < $archiveposts = \Canvas\Post::whereDate('published_at', date('F-Y'),function ($query) use ($slug) < $query->where('published_at', date('F-Y'), $slug); >)->published()->orderByDesc('published_at')->get(); return view('posts.archive', compact('archiveposts')); >
Route::get('archive/', '[email protected]')->name('posts.archive');
Answer
Solution:
You’re using whereDate wrongly, passing a closure as 3rd arg causes an error. Instead you may use and format your published_at column using MySQL’s function:
$archiveposts = \Canvas\Post ::whereRaw("date_format(published_at, '%M-%Y') = ?", [$slug]) ->published() ->orderByDesc('published_at') ->get(); return view('posts.archive', compact('archiveposts'));
Share solution ↓
Additional Information:
Didn’t find the answer?
Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.
Similar questions
Find the answer in similar questions on our website.
Write quick answer
Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.
About the technologies asked in this question
PHP
PHP (from the English Hypertext Preprocessor — hypertext preprocessor) is a scripting programming language for developing web applications. Supported by most hosting providers, it is one of the most popular tools for creating dynamic websites. The PHP scripting language has gained wide popularity due to its processing speed, simplicity, cross-platform, functionality and distribution of source codes under its own license.
https://www.php.net/
Laravel
Laravel is a free open source PHP framework that came out in 2011. Since then, it has been able to become the framework of choice for web developers. One of the main reasons for this is that Laravel makes it easier, faster, and safer to develop complex web applications than any other framework.
https://laravel.com/
MySQL
DBMS is a database management system. It is designed to change, search, add and delete information in the database. There are many DBMSs designed for similar purposes with different features. One of the most popular is MySQL. It is a software tool designed to work with relational SQL databases. It is easy to learn even for site owners who are not professional programmers or administrators. MySQL DBMS also allows you to export and import data, which is convenient when moving large amounts of information.
https://www.mysql.com/
HTML
HTML (English «hyper text markup language» — hypertext markup language) is a special markup language that is used to create sites on the Internet. Browsers understand html perfectly and can interpret it in an understandable way. In general, any page on the site is html-code, which the browser translates into a user-friendly form. By the way, the code of any page is available to everyone.
https://www.w3.org/html/
Welcome to programmierfrage.com
programmierfrage.com is a question and answer site for professional web developers, programming enthusiasts and website builders. Site created and operated by the community. Together with you, we create a free library of detailed answers to any question on programming, web development, website creation and website administration.
Get answers to specific questions
Ask about the real problem you are facing. Describe in detail what you are doing and what you want to achieve.
Help Others Solve Their Issues
Our goal is to create a strong community in which everyone will support each other. If you find a question and know the answer to it, help others with your knowledge.