Как объявить массив в свойстве класса
Подскажите, как объявить массив из другого класса?
У меня прописан массив в одном классе, а этот массив нужно использовать в форме2 для заполнения.
Как объявить внутри своего класса многомерный массив?
И вообще, возможно ли это? Задачи по порядку: Объявить внутри класса: 1) Одномерный массив.
Как объявить массив объектов одного класса в другом классе, а затем поместить в него объекты?
Как объявить массив объектов одного класса в другом классе, а затем поместить в него объекты?
Объявить массив? Запросто! Объявить массив массивов? А как это?
Доброго времени суток! Конечно, все знают, как объявить массив! int main ()
Посмотрите сюда.Может поможет
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
class Boo{ public function __construct($arr){ $this->mas=$arr; } function med(){ echo $this->mas[0].$this->mas[1]; } } $arr=array(10,23); $obj=new Boo($arr); $obj->med(); //print_r($obj);
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
class SomeClass { public $array = array( 'element1' => 'value', 'element2' => 2, ); // contstructor, etc . public function setArray(array $arr) { $this->array = $arr + $this->array; // переопределить и добавить элементы массива можно будет вот так $this->array = array_merge($this->array, $arr); // или вот так // do something return $this; } } $a = array('element1' => 1, 'element2' => 'stringValue', 'someValue'); $class = new SomeClass(); $class->setArray($a); var_dump($class->array);
Свойство class можно сделать закрытым (protected), а доступ предоставить к нему добавив методы set и get.
Вам следует обратить внимание на порядок вхождений при «объединении» массивов, т.к. в этой операции
имеется пара особенностей, которые описаны тут.
PHP5. Два способа объявления массива как члена класса
При объявлении массива как члена класса, каким образом это должно быть сделано?
class Test2 < private $paths; public function __construct() < $this->paths = array(); // some code here > >
Какой из них лучше с точки зрения передового опыта и производительности? Чтобы вы посоветовали?
Я предлагаю сделать это при объявлении переменной класса. Конструктор может быть переопределен в расширении классов, что может привести к E_NOTICE или даже E_WARNING, если какая-либо из ваших функций зависит от этой переменной, являющейся массивом (даже пустым)
Если вы собираетесь динамически заполнять свой массив во время инициализации, сделайте это в конструкторе. Если он содержит фиксированные значения, сделайте это в объявлении свойства.
Попытка заполнить массив динамически (например, используя возвращаемое значение определенной функции или метода) в объявлении приводит к ошибке синтаксического анализа:
// Function call is not valid here private $paths = get_paths();
Производительность здесь не вызывает особой озабоченности, поскольку каждый из них имеет свой собственный вариант использования.
В общем, поскольку я пишу в основном на других языках помимо PHP, мне нравится объявлять переменные экземпляра вне конструктора. Это позволит мне взглянуть на вершину класса и получить представление о всех свойствах и их модификаторах доступа без необходимости читать код.
Например, мне действительно не нравятся такие методы
// . // whole bunch of code // . public function initialize() < $this->foo = array(); // some other code to add some stuff to foo >
Теперь, если я просто посмотрю на класс, я не могу быть уверенным, что существует переменная foo, даже доступная. Если есть, я не знаю, есть ли у меня доступ к нему из любого места вне экземпляра.
Если вместо этого у меня есть:
в верхней части моего класса, я знаю, что foo является свойством экземпляра и что я могу получить к нему доступ из другого места.
Последствия не имеют. Остановите одержимость над вещами, которые не имеют значения – сосредоточьтесь на проблемах производительности, которые есть: сначала измерьте, оптимизируйте только верхних нарушителей.
Передача массива переменных в конструктор
Всем Привет. Изучаю PHP, вопрос такой, у меня много переменных передается в конструктор в классе Продукт, хотелось бы чтобы передавался массив, но как с ним работать в конструкторе, чтобы было работало как изначально было задумано. Спасибо.
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
class Product { public $name; public $x; public $y; public $z; public $weight; public $price; private $type; public $values = array("name", "x", "y", "z", "weight", "price", "type"); // ? function __construct($name, $x, $y, $z, $weight, $price, $type) { $this->$name = $name; $this->$x = $x; $this->$y = $y; $this->$z = $z; $this->$weight = $weight; $this->$price = $price; $this->calulationSize($x, $y, $z); $this->calulationWeight($weight); $this->outName($name); } private function filterTypeProduct($type) if(preg_match(" } else { // Once I do it } } . }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
require_once 'clasess/Product.php'; class CommercialProduct extends Product { public $lastname; function __construct($name, $x, $y, $z, $weight, $price, $lastname) // Override __constructor parent { parent::__construct($name, $x, $y, $z, $weight, $price, null); $this->$lastname = $lastname; $this->outName($name, $lastname); $this->calulationWeight($weight); $this->calulationSize($x, $y, $z); } . }
require_once 'clasess/Product.php'; require_once 'clasess/CommercialProduct.php'; $product = new Product("Somebody", 3, 4, 5, 2341, 1230.23, 0); $productCom = new CommercialProduct("Somebody-2", 5, 6, 7, 2341, 124151.12, "PRO");
Представление массивов в виде методов класса
допустим есть класс 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";