Я изучаю PHP, OOP, и я многому научился, но есть мелочи, которые дразнят меня,
Для иллюстрации создания объекта есть изображение, которое я создал: Link
если кто-то может ответить на несколько вопросов, пожалуйста …
Первый шаг: я определяю переменную объекта …
Второй шаг: созданный объект и его местоположение памяти попадают внутрь переменной, которую мы хотели …
Третий шаг: новая глобальная переменная, созданная с нашей ссылкой.
Что означает, что когда я вызываю объект (переменную):
Первый шаг: мы перейдем в область памяти, где наша переменная создана …
Второй шаг: значение переменной (ссылка) ссылается на ячейку памяти, в которой находится объект …
Третий шаг: у нас есть доступ к методам и свойствам этого объекта.
Я буду рад, если кто-то может помочь мне понять это, спасибо всем и хорошо провести день.
Чтобы иметь строковое представление объекта, вы должны реализовать функцию __toString()
Что касается внутренних механизмов – это намного сложнее, чем вы думаете. Поскольку PHP является динамическим языком – он должен хранить много информации для каждого класса, для каждого объекта класса. Не просто память, необходимая для строковой переменной, но и отображение функций, структуры управления памятью, структуры типов, значения по умолчанию. Если вы хотите глубже, прочитайте это
PHP не возвращает ссылку на память, а экземпляр вашего класса. В общем, вам неизвестно, где в памяти создается и сохраняется объект. Если вам все еще нужно работать с ячейками памяти и ссылками в PHP, то на Stack Overflow уже есть отличный ответ: как проверить расположение памяти переменной в php? , Что касается использования ООП в PHP, вы должны проверить руководство по классам и объектам на php.net.
Что касается эхо-сигнала объекта: если вы хотите эхо-объект, вам нужно определить магический метод __toString()
который указывает, как объект должен быть представлен как строка. В вашем случае это будет
<?php class x { public function num() { return 5; } public function __toString() { return $this->num(); } } $ob = new x(); echo $ob; // outputs 5
В PHP $ob
не является ссылкой на ячейку памяти, а экземпляр класса. Таким образом, вы также можете вызвать echo $ob->num();
без определения метода __toString()
.
Все переменные PHP хранятся как «zval».
Узнать больше о zval's: http://docstore.mik.ua/orelly/webprog/php/ch14_06.htm
Функция для сброса внутренней информации zval: http://php.net/manual/en/function.debug-zval-dump.php
Когда вы пытаетесь повторить свой объект, вы должны переопределить магическую функцию __toString () в своем классе. Я действительно советую вам прочитать эту статью http://net.tutsplus.com/tutorials/php/object-oriented-php-for-beginners/ . Это в значительной степени отвечает на ваши вопросы.
Я не программист на PHP, но, возможно, я могу помочь вам хотя бы немного, чтобы снизить ваше замешательство.
Опять же, я не уверен, как php (поскольку он интерпретируется языком) фактически обрабатывает создание объекта, но он должен быть очень близок к тому, как это делает C ++. В конце концов, в бегах на том же HW.
Итак, вы знаете, что ваш класс является «шаблоном» для компилятора (интерпретатора). Но вам нужно понять, что такое объект на самом деле. Объект фактически подобен таблице информации. Он содержит переменные вашего класса. Он не содержит методов.
Таким образом, при создании объекта с использованием new
оператора эта «таблица» создается в памяти и заполняется значениями. Эта таблица имеет свой базовый адрес. Это назначается переменной объекта.
Здесь важно, что объект не содержит актуационных методов. Они создаются в другом месте в памяти. Когда вы вызываете некоторый метод объекта, вы фактически называете «регулярную» функцию, а компилятор передает адрес объекта (этой таблицы) в него как один из его параметров.
Это очень упрощено. Но я считаю, что это должно помочь вам создать изображение, что на самом деле делает компьютер в фоновом режиме.