@ElenaElli

Что нужно исправить чтобы все работало?

Добрый день, меня зовут Елена. В PHP я не так давно, основы знаю, но ООП идет тяжело. К сожалению друзей и знакомых нет в этой сфере нет и помочь некому. Вот код с ошибками, нужно исправить по мере возможности, вдруг у кого получится сделать так, чтобы все работало(желательно с комментариями, чтобы я прикинула что к чему), вы мне очень поможете.
Спасибо за внимание))
<?php
namespace Test3;

class newBase
{
    static private $count = 0;
    static private $arSetName = [];
    /**
     * @param string $name
     */
    function __construct(int $name = 0)
    {
        if (empty($name)) {
            while (array_search(self::$count, self::$arSetName) != false) {
                ++self::$count;
            }
            $name = self::$count;
        }
        $this->name = $name;
        self::$arSetName[] = $this->name;
    }
    private $name;
    /**
     * @return string
     */
    public function getName(): string
    {
        return '*' . $this->name  . '*';
    }
    protected $value;
    /**
     * @param mixed $value
     */
    public function setValue($value)
    {
        $this->value = $value;
    }
    /**
     * @return string
     */
    public function getSize()
    {
        $size = strlen(serialize($this->value));
        return strlen($size) + $size;
    }
    public function __sleep()
    {
        return ['value'];
    }
    /**
     * @return string
     */
    public function getSave(): string
    {
        $value = serialize($value);
        return $this->name . ':' . sizeof($value) . ':' . $value;
    }
    /**
     * @return newBase
     */
    static public function load(string $value): newBase
    {
        $arValue = explode(':', $value);
        return (new newBase($arValue[0]))
            ->setValue(unserialize(substr($value, strlen($arValue[0]) + 1
                + strlen($arValue[1]) + 1), $arValue[1]));
    }
}
class newView extends newBase
{
    private $type = null;
    private $size = 0;
    private $property = null;
    /**
     * @param mixed $value
     */
    public function setValue($value)
    {
        parent::setValue($value);
        $this->setType();
        $this->setSize();
    }
    public function setProperty($value)
    {
        $this->property = $value;
        return $this;
    }
    private function setType()
    {
        $this->type = gettype($this->value);
    }
    private function setSize()
    {
        if (is_subclass_of($this->value, "Test3\newView")) {
            $this->size = parent::getSize() + 1 + strlen($this->property);
        } elseif ($this->type == 'test') {
            $this->size = parent::getSize();
        } else {
            $this->size = strlen($this->value);
        }
    }
    /**
     * @return string
     */
    public function __sleep()
    {
        return ['property'];
    }
    /**
     * @return string
     */
    public function getName(): string
    {
        if (empty($this->name)) {
            throw new Exception('The object doesn\'t have name');
        }
        return '"' . $this->name  . '": ';
    }
    /**
     * @return string
     */
    public function getType(): string
    {
        return ' type ' . $this->type  . ';';
    }
    /**
     * @return string
     */
    public function getSize(): string
    {
        return ' size ' . $this->size . ';';
    }
    public function getInfo()
    {
        try {
            echo $this->getName()
                . $this->getType()
                . $this->getSize()
                . "\r\n";
        } catch (Exception $exc) {
            echo 'Error: ' . $exc->getMessage();
        }
    }
    /**
     * @return string
     */
    public function getSave(): string
    {
        if ($this->type == 'test') {
            $this->value = $this->value->getSave();
        }
        return parent::getSave() . serialize($this->property);
    }
    /**
     * @return newView
     */
    static public function load(string $value): newBase
    {
        $arValue = explode(':', $value);
        return (new newBase($arValue[0]))
            ->setValue(unserialize(substr($value, strlen($arValue[0]) + 1
                + strlen($arValue[1]) + 1), $arValue[1]))
            ->setProperty(unserialize(substr($value, strlen($arValue[0]) + 1
                + strlen($arValue[1]) + 1 + $arValue[1])))
            ;
    }
}
function gettype($value): string
{
    if (is_object($value)) {
        $type = get_class($value);
        do {
            if (strpos($type, "Test3\newBase") !== false) {
                return 'test';
            }
        } while ($type = get_parent_class($type));
    }
    return gettype($value);
}


$obj = new newBase('12345');
$obj->setValue('text');

$obj2 = new \Test3\newView('O9876');
$obj2->setValue($obj);
$obj2->setProperty('field');
$obj2->getInfo();

$save = $obj2->getSave();

$obj3 = newView::load($save);

var_dump($obj2->getSave() == $obj3->getSave());
  • Вопрос задан
  • 248 просмотров
Пригласить эксперта
Ответы на вопрос 3
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
К сожалению друзей и знакомых нет в этой сфере нет и помочь некому.
Это не так. У вас есть как минимум 2 друга (как минимум в данной задаче) - интерпретатор php и гугл. Первый знает что происходит, а второй как это исправить.

вдруг у кого получится сделать так, чтобы все работало
Вдруг ничего не бывает.
1) Читаете ошибку, если все понятно - исправляете.
2) Если не понятно - гуглите.
3) Если и так не помогло - тогда по конкретной проблеме пишете сюда.
4) Разбираетесь что надо сделать, правите
5) При возникновении ошибки повторяете с п. 1 по п. 4.
Ответ написан
Комментировать
jey_val_star
@jey_val_star
Программист
Тут function __construct(int $name = 0)
указан тип int для переменной $name - функция ждет параметр с целочисленным типом

а тут $obj = new newBase('12345');
передаете число в кавычках и в итоге это string...

или измените тип принимаемого аргумента (int $name) или передавайте число как число
(без кавычек - newBase(12345) )

Лично я склоняюсь к первому варинату - (string $name)
Ответ написан
Комментировать
@NevermindWano
PHP Разработчик
Приветствую. Я так понимаю, что это какая-то учебная задачка. По коду видно, что Вы новичок и вам тяжело все это дается, понимаю. Ничего страшного. Все через это проходили.
Сделать, чтобы всё работало у меня не получилось, но и я не прям углубился в код, но вот, что по быстрому обнаружил:
<?php
namespace Test3;

class newBase
{
	static private $count = 0;
	static private $arSetName = [];
	/**
	 * @param string $name
	 */
	function __construct(int $name = 0)
	{
		if (empty($name)) {
			while (array_search(self::$count, self::$arSetName) != false) {
				++self::$count;
			}
			$name = self::$count;
		}
		$this->name = $name;
		self::$arSetName[] = $this->name;
	}
	private $name;   // Для наглядности желательно не перемешивать методы и поля. Лучше когда сначала поля, потом методы.
	/**
	 * @return string
	 */
	public function getName(): string
	{
		return '*' . $this->name  . '*';
	}
	protected $value;
	/**
	 * @param mixed $value
	 */
	public function setValue($value)
	{
		$this->value = $value;
	}
	/**
	 * @return string
	 */
	public function getSize()
	{
		$size = strlen(serialize($this->value));
		return strlen($size) + $size;
	}
	public function __sleep()
	{
		return ['value'];
	}
	/**
	 * @return string
	 */
	public function getSave(): string
	{
		$value = serialize($value); // Здесь ошибка, должно быть $this->value в аргументе serialize()
		return $this->name . ':' . sizeof($value) . ':' . $value; // Вместо sizeof, должно быть strlen, т.к. $value - строка
	}
	/**
	 * @return newBase
	 */
	static public function load(string $value): newBase
	{
		$arValue = explode(':', $value);
		return (new newBase($arValue[0]))
			->setValue(unserialize(substr($value, strlen($arValue[0]) + 1
				+ strlen($arValue[1]) + 1), $arValue[1])); // метод setValue ничего не возвращает.
														   // Предполагается, что он должен вернуть объект класса newBase
									
	}
}
class newView extends newBase
{
	private $type = null;
	private $size = 0;
	private $property = null;
	/**
	 * @param mixed $value
	 */
	public function setValue($value)
	{
		parent::setValue($value);
		$this->setType();
		$this->setSize();
	}
	public function setProperty($value)
	{
		$this->property = $value;
		return $this;
	}
	private function setType()
	{
		$this->type = gettype($this->value);
	}
	private function setSize()
	{
		if (is_subclass_of($this->value, "Test3\newView")) { // Ошибка, условие никогда не сработает, т.к. символ \n означает новую строку
			$this->size = parent::getSize() + 1 + strlen($this->property);
		} elseif ($this->type == 'test') {
			$this->size = parent::getSize();
		} else {
			$this->size = strlen($this->value);
		}
	}
	/**
	 * @return string
	 */
	public function __sleep()
	{
		return ['property'];
	}
	/**
	 * @return string
	 */
	public function getName(): string
	{
		if (empty($this->name)) {  // Поле name в родительском классе с модификатором private, по-этому ошибка
			throw new Exception('The object doesn\'t have name'); // Не импортирован класс Exception (use Exception)
		}
		return '"' . $this->name  . '": ';
	}
	/**
	 * @return string
	 */
	public function getType(): string
	{
		return ' type ' . $this->type  . ';';
	}
	/**
	 * @return string
	 */
	public function getSize(): string
	{
		return ' size ' . $this->size . ';';
	}
	public function getInfo()
	{
		try {
			echo $this->getName()
				. $this->getType()
				. $this->getSize()
				. "\r\n";
		} catch (Exception $exc) {
			echo 'Error: ' . $exc->getMessage();
		}
	}
	/**
	 * @return string
	 */
	public function getSave(): string
	{
		if ($this->type == 'test') {
			$this->value = $this->value->getSave(); // Здесь иногда прилетает вместо объекта сериализованная строка.
		}
		return parent::getSave() . serialize($this->property);
	}
	/**
	 * @return newView
	 */
	static public function load(string $value): newBase
	{
		$arValue = explode(':', $value);
		return (new newBase($arValue[0]))
			->setValue(unserialize(substr($value, strlen($arValue[0]) + 1
				+ strlen($arValue[1]) + 1), $arValue[1]))
			->setProperty(unserialize(substr($value, strlen($arValue[0]) + 1
				+ strlen($arValue[1]) + 1 + $arValue[1]))); // метод setValue ничего не возвращает.
															// Предполагается, что он должен вернуть объект класса newBase
				// Также ошибка, в аргументе setProperty - unserialize
				// Или я не понял задумку. Вторым аргументом unserialize идет options, и тут явная ошибка
				// https://www.php.net/manual/ru/function.unserialize.php

				// Еще у класса newBase нет метода setProperty
	}
}
function gettype($value): string
{
	if (is_object($value)) {
		$type = get_class($value);
		do {

			if (strpos($type, "Test3\newBase") !== false) { // Ошибка, условие никогда не сработает, т.к. символ \n означает новую строку
						                                           // А еще лучше - if ($value instanceof newBase)
				return 'test';
			}
		} while ($type = get_parent_class($type)); // Не совсем понятно, зачем тут нужен этот цикл, что он делает?
	}
	return gettype($value); // Если $value не объект - то бесконечная рекурсия???
}


$obj = new newBase('12345'); // Ну про тип аргумента конструктора уже говорили.
$obj->setValue('text');

$obj2 = new \Test3\newView('O9876');
$obj2->setValue($obj);
$obj2->setProperty('field');
$obj2->getInfo();

$save = $obj2->getSave();

$obj3 = newView::load($save);

var_dump($obj2->getSave() == $obj3->getSave()); // Внутри метода getSave() всегда срабатывает проверка на тип == test,
												// и внутри этого if вызывается метод getSave() со строки.
												// нипанятна))))	

/**
*
* В целом не совсем понятно, что и как должно работать
* Я не сильно в код углубился, и не совсем понял задумку,
* но в целом код не рабочий))).
*
*/


Да, и если Вы сформулируете какая стояла задача, то могу помочь написать адекватный код))).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽