В php при инициализации класса, как передать переменную этому классу, которая будет использоваться в ее функциях?
Итак, вот сделка. Я хочу вызвать класс и передать ему значение, чтобы он мог использоваться внутри этого класса во всех различных функциях ect. ЭСТ. Как мне это сделать?
Я хочу вызвать класс и передать ему значение, чтобы он мог использоваться внутри этого класса
Концепция называется «конструктор».
Как следует из других ответов, вы должны использовать синтаксис унифицированного конструктора ( __construct() ) с PHP 5. Вот пример того, как это выглядит:
class Foo < function __construct($init_parameter) < $this->some_parameter = $init_parameter; > > // in code: $foo = new Foo("some init value");
Примечание. Существуют так называемые конструкторы старого стиля, которые вы можете использовать в устаревшем коде. Они выглядят так:
class Foo < function Foo($init_parameter) < $this->some_parameter = $init_parameter; > >
Эта форма официально устарела с PHP 7, и вы больше не должны использовать ее для нового кода.
В новых версиях PHP (5 и выше) функция __constuct вызывается всякий раз, когда вы используете «new », поэтому, если вы хотите передать данные в объект, добавьте параметры функции construct, а затем вызовите
$obj = new Object($some, $parameters); class Object < function __construct($one, $two) <>>
Именованные конструкторы выходят из PHP в пользу метода __construct.
class SomeClass < public $someVar; public $otherVar; public function __construct() < $arguments = func_get_args(); if(!empty($arguments)) foreach($arguments[0] as $key =>$property) if(property_exists($this, $key)) $this-> = $property; > > $someClass = new SomeClass(array('someVar' => 'blah', 'otherVar' => 'blahblah')); print $someClass->someVar;
Это означает, что в долгосрочной перспективе это будет меньше.
Порядок передаваемых переменных больше не важен (больше не записывается по умолчанию, например «null»: someClass (null, null, true, false))
Добавление новой переменной менее затруднительно (не нужно писать назначение в конструкторе)
Когда вы смотрите на экземпляр класса, вы сразу узнаете, что передают переменные:
Person(null, null, true, false)
Person(array('isFat' => true, 'canRunFast' => false))
class MyClass < public variable; //just declaring my variables first (becomes 5) public variable2; //the constructor will assign values to these(becomes 6) function __construct($x, $y) < $this->variable = $x; $this->variable2 = $y; > function add() < $sum = $this->variable + $this->variable2 return $sum; > > //end of MyClass class
Создайте экземпляр, а затем вызовите функцию add
$myob = new MyClass(5, 6); //pass value to the construct function echo $myob->add();
11 будет написана на странице не очень полезный пример, потому что вы предпочтете передать значение для добавления, когда вы его вызывали, но это иллюстрирует точку.
Вы можете сделать это вот так:
class SomeClass < var $someVar; function SomeClass($yourValue) < $this->someVar = $yourValue; > function SomeFunction() < return 2 * $this->someVar; > >
или вы можете использовать __construct вместо SomeClass для конструктора в php5.
Думайте, что у всех здесь нет очевидного. Да, конструктор PHP4 устарел, но вы можете написать свой класс для обратной совместимости следующим образом:
class myClass < var $myVar; function myClass < // PHP4 constructor, calls PHP5 constructor $this->__construct(); > function __construct() < // PHP5 constructor doSomeStuff($myVar); >>
Ничего себе, я не могу поверить в ответы здесь! Они все будут работать, но будут неправильными, правильный способ установить переменные – это геттер и сеттер, это позволяет вам аккуратно настроить вашу переменную и выполнить проверки и т. Д. например
class myClass < private $myVar; public function set_var($var) < // You can then perform check on the data etc here $this->myVar = $var; > function __construct() < // PHP5 constructor >public function do_something() < echo "blah"; >>
Это позволяет вам правильно вызвать объект, например
$objNew = new myClass(); $objNew->set_var("Set my variable"); $objNew->do_something();
Это хороший способ сделать это, а на больших проектах и сценариях вы будете этому рады, у меня возникает эта проблема прямо сейчас с скриптом some-else, который не может быть легко обновлен, потому что он был написан другими способами, упомянутыми в этом стр.
Это также позволяет вам иметь неограниченное количество переменных для класса без глупого вызова объекта, например
$objNew = new myClass("var1","var1","var1","var1","var1","var1","var1","var1","var1","var1","var1","var1","var1","var1","var1","var1","var1");
Это в основном не яснее, чем использование функции.
Передача объектов параметрами
Давайте сделаем еще и класс EmployeesCollection , который будет хранить массив работников, то есть массив объектов класса Employee .
Пусть работники будут храниться в свойстве employees , а для добавления работников будет существовать метод add . Этот метод параметром будет принимать объект класса Employee и записывать его в конец массива $this->employees :
Давайте также добавим в наш класс метод getTotalSalary , который будет находить суммарную зарплату всех хранящихся работников:
Давайте проверим работу класса EmployeesCollection :
add(new Employee(‘john’, 100)); $employeesCollection->add(new Employee(‘eric’, 200)); $employeesCollection->add(new Employee(‘kyle’, 300)); echo $employeesCollection->getTotalSalary(); // выведет 600 ?>?php>
Давайте сделаем наш класс EmployeesCollection более жизненным и добавим метод получения всех работников и метод подсчета:
employees; > // Подсчитываем количество хранимых работников: public function count() < return count($this->employees); > public function add($employee) < $this->employees[] = $employee; > public function getTotalSalary() < $sum = 0; foreach ($this->employees as $employee) < $sum += $employee->getSalary(); > return $sum; > > ?>?php>
Сделайте класс Product , в котором будут приватные свойства name , price и quantity . Пусть все эти свойства будут доступны только для чтения.
Добавьте в класс Product метод getCost , который будет находить полную стоимость продукта (сумма умножить на количество).
Сделайте класс Cart . Данный класс будет хранить список продуктов (объектов класса Product ) в виде массива. Пусть продукты хранятся в свойстве products .
Реализуйте в классе Cart метод add для добавления продуктов.
Реализуйте в классе Cart метод remove для удаления продуктов. Метод должен принимать параметром название удаляемого продукта.
Реализуйте в классе Cart метод getTotalCost , который будет находить суммарную стоимость продуктов.
Реализуйте в классе Cart метод getTotalQuantity , который будет находить суммарное количество продуктов (то есть сумму свойств quantity всех продуктов).
Реализуйте в классе Cart метод getAvgPrice , который будет находить среднюю стоимость продуктов (суммарная стоимость делить на количество всех продуктов).
Как ввести внешнюю переменную в класс PHP?
Например есть у меня некая $var и есть
class MyClass
<
//Внутри которого несколько функций
function name1()
<
>
function name2()
<
>
>
Вводить внутрь функций я умею используя global $var; Но для введя в name1() эту переменную я не могу ее использовать в name2() и та ее прийдется в свою очередь тоже декларировать. А вот как мне ее прописать в самом классе один раз и использовать во всех функциях внутри этого класса?
Не совсем правильно тогда сформулировал вопрос. Опишу подробнее. Есть PDO который сам по себе класс, подключаю $db = new PDO(. ); Далее у меня есть еще один класс, который обрабатывает данные class MyClass <>, в его методы (извиняюсь что обозвал их функциями) $db только через global подключается, иначе выдает Undefined variable. Мой вопрос был как раз про это, как мне включить $db внутрь класса MyClass <> без необходимости подключения в каждой функции через глобал? Функций у меня десятка два внутри этого класса и везде прописывать как то неправильно, что то должно быть такое что позволит $db использовать внутри MyClass <> без глобалов. Нашелся вариант сделать MyClass как extends PDO но что то мне кажется это тоже неправильно.
class MyClass <
var $db
function __construct()
<
$this->db = new PDO(. );
>
function name1()
<
$this->db .
>
>
Во первых внутри классов нет функций, а есть методы
Во вторых тебе это для чего, то что ты пишешь бред какой то 🙂
Можете тебе нужны свойства?
class MyClass
<
private $var;
function name1()
<
// Обращаемся к свойству как $this->var;
>
function name2()
<
// Обращаемся к свойству как $this->var;
>
>