Используя функцию __toString как вывести эти properties?
Как вывести названия продуктов, цены и имена владельцев через проход по итератору используя __tostring?
<?php
namespace lesson2;
header('Content-Type: text/html; charset=utf-8');
class User{
private $name;
private $balance;
function __construct($name,$balance){
$this->name = $name;
$this->balance = $balance;
}
public function getName(){
return $this->name;
}
public function getBalance(){
return $this->balance;
}
public function __toString(){
return "У пользователя ".$this->getName()." сейчас на счету ".$this->getBalance()."<br/>";
}
public function giveMoney($user, $amount){
if($amount > $this->balance){
return 'Недостаточно средств!'."<br/>";
}
else{
$this->balance -= $amount;
$user->balance += $amount;
return "Пользователь ".$this->name." перечислил ".$amount." пользователю ".$user->name."<br/>";
}
}
}
abstract class Product
{
private $name;
private $price;
private $owner;
static private $products = array();
function __construct($name, $price, $owner)
{
$this->name = $name;
$this->price = $price;
$this->owner = $owner;
}
public function setOwner(User $user)
{
$this->owner = $user;
}
public static function getProductIterator()
{
return new class (self::$products) implements \Iterator {
private $position = 0;
private $array;
public function __construct($array)
{
$this->array = $array;
}
public function rewind()
{
$this->position = 0;
}
public function current()
{
return $this->array[$this->position];
}
public function key()
{
return $this->position;
}
public function next()
{
++$this->position;
}
public function valid()
{
return isset($this->array[$this->position]);
}
};
}
public static function registerProduct($product)
{
if (in_array($product, self::$products, true)) {
echo 'Введены одинаковые продукты ' . '</br>';
} else {
array_push(self::$products, $product);
}
}
}
class Processor extends Product{
private $frequency;
public function __construct($name, $price, $owner,$frequency)
{
parent::__construct($name, $price, $owner);
$this->frequency=$frequency;
}
}
class Ram extends Product{
private $type;
private $memory;
public function __construct($name, $price, $owner, $type, $memory)
{
parent::__construct($name, $price, $owner);
$this -> type = $type;
$this -> memory = $memory;
}
}
///////////////////////////////////////////
$a = new Processor("Intel",4500,"Kirill",3.9);
Product::registerProduct($a);
Product::getProductIterator();
Ответы (2 шт):
Автор решения: Slava Rozhnev
→ Ссылка
Прежде всего следует расширить класс Product методом __toString:
public function __toString(){
return "Продукт: " . $this->name .
" цена: " . $this->price .
" владелец: " . $this->owner;
}
затем можно воспользоваться методом следующим образом:
$a = new Processor("Intel",4500,"Kirill",3.9);
Product::registerProduct($a);
$products = Product::getProductIterator();
foreach ($products as $p) {
# неявный вызов метода __toString()
echo $p;
}
Рабочий код находится здесь: PHPize.online
Автор решения: Meow
→ Ссылка
Для начала добавим в класс Product магический метод __toString() с помощью которого мы определим поведение класса при его конвертации в строку.
class Product
{
private string $name;
private string $owner;
private int $price;
/**
* @var self[]|null
*/
static public ?array $products = null;
function __construct(string $name, string $owner, int $price)
{
$this->name = $name;
$this->owner = $owner;
$this->price = $price;
}
public static function makeIterator(): Iterator
{
// Реализация
}
public function __toString(): string
{
return $this->name . ';' . $this->owner . ';' . $this->price . ';';
}
}
Подготовим объекты и сохраним их в статическом свойстве.
$product1 = new Product('Процессор', 'Иван', 15860);
$product2 = new Product('Системный блок', 'Иван', 5860);
$product3 = new Product('Клавиатура', 'Иван', 1423);
Product::$products = [$product1, $product2, $product3];
Затем пройдёмся по итератору и конвертируем каждый объект Product в строку.
foreach (Product::makeIterator() as $product) {
var_dump((string)$product);
}
Результат
