Php массив функций в классе

Представление массивов в виде методов класса

допустим есть класс 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) < >> ?>

Давайте посмотрим, как мы будем пользоваться нашим классом:

Вот еще пример — найдем сумму квадратов элементов массива и сумму кубов и сложим результат вместе:

Фактически мы получаем набор функций, просто сгруппированных в одном классе. Однако, в отличие от обычного набора функций, мы можем пользоваться преимуществами ООП — например, делать вспомогательные методы приватными, чтобы они не были доступны извне класса.

Давайте приступим к написанию кода нашего класса.

Если обдумать реализацию методов, то становится очевидно, что они будут фактически одинаковыми, отличие будет только в степени, в которую будут возводится элементы нашего массива. Вот код, иллюстрирующий это:

Вместо того, чтобы реализовывать каждый метод заново, давайте лучше сделаем вспомогательный приватный метод 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) < >> ?>

Математическая подсказка: корень первой степени — это само число. То есть 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
    CommunityBot
    11 silver badge
    answered Nov 4, 2012 at 17:31
2
    What about MenuItemList::__toString()?
    – Madara's Ghost
    Nov 4, 2012 at 17:33
    @MadaraUchiha: That could output a plain-text representation for debugging purposes. However you could create a HTML decorator for that menulist that would output a HTML list with it's __toString() method. But the menuitems should not care about how they are output in specific. That's the job of some other part of the code.
    – hakre
    Nov 4, 2012 at 17:34
Add a comment|
0

At top of your class

$menuItems = array();
function setMenuItem($name, $value) < $this->menuItems[] = array($name, $value); > 

Edit: You could change the way they are stored, and prevent duplicates by using the nav "Name" as the key it is stored under, but I've kept it simple for ease of understanding.

Heres a more advanced sample

function setMenuItem($name, $value) < if(!in_array(array_keys($this->menuItems)), $name) < $this->menuItems[$name] = $value; > else < echo "That's already been added!"; //Handle this properly though >> 

Источник

Читайте также:  Html тег новой страницы
Оцените статью