Представление массивов в виде методов класса
допустим есть класс Vars, который работает с этими массивами:
class Vars{ public $this->elem = null; function __construct($nameArr){ if($nameArr=='sess')$this->elem = $_SESSION; elseif($nameArr == 'post')$this->elem = $_POST; . }
$sess = new Vars('sess'); echo $sess->user->id;
Понятное дело, что нужно использовать магические методы. проблема возникает в следующем. метод __get() возвращает $this, что в принципе и логично, когда мы запрашиваем user. Но как дать понять программе, что id это конечный метод и что уже надо возвращать не $this, а именно то значение, которое запрашивается?
может быть пример с echo не совсем удачен, ибо есть метод __toString(); Вопрос вообще относиться и к таким вещам, когда проверяется условие какое-то (это не обязательно будет string).
Например:
Использование массивов внутри методов класса
Нужно сделать так, чтобы массив NextBrick можно было использовать в ShowNB. При этом Массив.
Оформить функции в виде методов класса
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <locale.h> struct Stack.
Реализовать в виде класса набор методов
Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами: 1).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
class Vars { private $data; public function __construct(array $data) { $this->data = $data; } public function __get($name) { $name = (string) $name; if (isset($this->data[$name])) { $value = $this->data[$name]; if (is_array($value)) { return new self($value); } else { return $value; } } else { return null; } } } $vars = new Vars(array( "foo" => 42, "bar" => array( "lorem" => 10, "ipsum" => 20, ), )); var_dump( $vars->foo, $vars->bar->lorem );
Добавлено через 1 минуту
lapaliv, Понятия не имею, как Вы собрались работать в массивами, как с единым целым значением. Например, если я хочу получить весь массив из $vars->bar в последнем примере.
if($nameArr=='sess')$this->elem = $_SESSION; elseif($nameArr == 'post')$this->elem = $_POST; .
это говнокод, сам не видишь этого? какие ещё елсеиф? что за sess? пиши уж session.
если у тебя не все на ООП, то лучше брось эту затею. гимора много, пользы мало.
Если так интересно, посмотри как я делал. http://krugozor.svn.sourceforg. zor/Cover/
Открой test.php, поменяй кодировка на win и смотри что может этот набор классов. Основной движок — встроенный класс ArrayAccess и магические методы.
В общем, разберешься. Вот что эта приблуда умеет:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
error_reporting(E_ALL); include('./Interface.php'); include('./Abstract/Simple.php'); include('./Abstract/Array.php'); include('./Array.php'); // Тесты возможностей класса Cover_Array. echo "> Content var \$array type of Cover_Array:\n"; $array = new Krugozor_Cover_Array( array('foo', 12345, 'element' => array('key' => 'value', 'key2' => 'value2')) ); print_r($array); echo "\n\n"; echo "> echo \$array->item(0);\n"; echo $array->item(0); // foo echo "\n\n"; echo "> echo \$array->element->key;\n"; echo $array->element->key; // value echo "\n\n"; echo "> echo \$array['element']['key'];\n"; echo $array['element']['key']; // value echo "\n\n"; echo "> echo \$array->element->count();\n"; echo $array->element->count(); // 2 echo "\n\n"; echo "> echo \$array->element->append('Hellow, PHP!')->item(0);\n"; echo $array->element->append('Hellow, PHP!')->item(0); // Hellow, PHP! echo "\n\n"; echo "> echo \$array->element->count();\n"; echo $array->element->count(); // 3 echo "\n\n"; echo "> print_r(\$array->getDataAsArray());\n"; print_r($array->getDataAsArray()); // получаем обычный массив echo "\n\n"; echo "> foreach by \$array->element:\n"; foreach ($array->element as $key => $value) { echo "$key => $value \n"; } echo "\n\n"; echo "> \$array->is_array = array(1, 2, 3);\n"; echo "> print_r(\$array->is_array);\n"; $array->is_array = array(1, 2, 3); print_r($array->is_array); // Cover_Array Object ( [data:protected] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) echo "\n"; echo "> var_dump(\$array->non_exists_prop);\n"; var_dump($array->non_exists_prop); // NULL, никаких Notice echo "\n"; echo "> print_r(\$array['non_exists_prop']);\n"; print_r($array['non_exists_prop']); // Cover_Array Object echo "\n\n"; echo "> \$array['non_exists_prop']['non_exists_prop']['property'] = true;\n"; echo "> print_r(\$array['non_exists_prop']);\n"; $array['non_exists_prop']['non_exists_prop']['property'] = true; print_r($array['non_exists_prop']); // создалась цепочка вложенных массивов echo "> echo \$array['non_exists_prop']['non_exists_prop'];\n"; echo $array['non_exists_prop']['non_exists_prop']; // string '' echo "\n\n";
Класс как набор методов в ООП на PHP
Часто классы используются просто как набор некоторых методов, сгруппированных вместе. В этом случае нам не нужно создавать много объектов этого класса, а достаточно всего одного.
Для примера давайте сделаем класс ArraySumHelper , который предоставит нам набор методов для работы с массивами. Каждый метод нашего класса будет принимать массив, что-то с ним делать и возвращать результат. Пусть у нас будет следующий набор методов:
// Сумма квадратов элементов массива: public function getSum2($arr) < >// Сумма кубов элементов массива: public function getSum3($arr) < >// Сумма четвертых степеней элементов массива: public function getSum4($arr) < >> ?>?php>
Давайте посмотрим, как мы будем пользоваться нашим классом:
Вот еще пример — найдем сумму квадратов элементов массива и сумму кубов и сложим результат вместе:
Фактически мы получаем набор функций, просто сгруппированных в одном классе. Однако, в отличие от обычного набора функций, мы можем пользоваться преимуществами ООП — например, делать вспомогательные методы приватными, чтобы они не были доступны извне класса.
Давайте приступим к написанию кода нашего класса.
Если обдумать реализацию методов, то становится очевидно, что они будут фактически одинаковыми, отличие будет только в степени, в которую будут возводится элементы нашего массива. Вот код, иллюстрирующий это:
Вместо того, чтобы реализовывать каждый метод заново, давайте лучше сделаем вспомогательный приватный метод getSum , который параметрами будет принимать массив и степень и возвращать сумму степеней элементов массива:
Давайте поменяем методы нашего класса с использованием нового метода getSum :
Наш класс ArraySumHelper больше учебный, чем реальный, но тут вам важно понять принцип — то, что часто некоторый класс может использоваться просто как набор методов и при этом создается только один объект класса. В дальнейшем мы будем разбирать более жизненные (но и более сложные) примеры.
Напишите реализацию методов класса ArrayAvgHelper , заготовки методов которого расположены ниже:
/* Находит сумму вторых степеней элементов массива и извлекает из нее квадратный корень: */ public function getAvg2($arr) < >/* Находит сумму третьих степеней элементов массива и извлекает из нее кубический корень: */ public function getAvg3($arr) < >/* Находит сумму четвертых степеней элементов массива и извлекает из нее корень четвертой степени: */ public function getAvg4($arr) < >/* Вспомогательный метод, который параметром принимает массив и степень и возвращает сумму степеней элементов массива: */ private function getSum($arr, $power) < >/* Вспомогательный метод, который параметром принимает целое число и степень и возвращает корень заданной степени из числа: */ private function calcSqrt($num, $power) < >> ?>?php>
Математическая подсказка: корень первой степени — это само число. То есть calcSqrt(число, 1) должно просто вернуть само число.
А корень любой степени можно найти с помощью функции pow , просто параметром передав ей дробь. Например, pow(число, 1/3) — так найдем корень третьей степени.
Using Array in PHP Class
I am exercising some PHP OOP and therefore I am creating a class to create a simple navigation menu ( with extensions in the future ) now I have build this class that works kinda.. with 1 menu item tough.. I don;t know how to use arrays in my class to use the class like
setMenuItem("home", "test"); echo $menu->display(); ?>
as you see I should be able to give each menu item with the setMenuItem(); method. but since it does not use Arrays at the moment I only get the first value The class itself is as follows:
who can show me how to use arrays within the class in combination with a loop to create a menu with all given values? Thanks in advance.
4 Answers 4
You actually have two types, not one:
The MenuItemList would take care of managing the list. It could use an array internally. A code example for something very similar could be found in a previous answer: Array Object In Php.
Next to that the display() method does not belong into the two. Instead you should make your template that keen it knows how to output a menu list:
echo '
'; foreach ($menu as $item) < echo ')" data-controller="se-share-sheet" data-se-share-sheet-title="Share a link to this answer" data-se-share-sheet-subtitle="" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter devto" data-se-share-sheet-location="2" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f3.0%2f" data-se-share-sheet-license-name="CC BY-SA 3.0" data-s-popover-placement="bottom-start">Share)" title="">Improve this answer)">edited May 23, 2017 at 10:26 CommunityBot11 silver badgeanswered Nov 4, 2012 at 17:31 hakrehakre)" >192k52 gold badges434 silver badges834 bronze badges