PhpStorm автозаполнение STD Объект не работает - PullRequest
0 голосов
/ 13 ноября 2018

Я использую PhpStorm для создания моего следующего проекта. Банкомат Я ищу чистый способ сохранить все свои почтовые запросы, вместо того, чтобы проверять их все по одному, используя isset и т. Д., Чтобы я мог зациклить свой stdObject.

Я пытаюсь создать объект STD, но PHP не выполняет его автоматически. Я думаю, что я должен использовать PHPDoc, но не могу заставить его работать.

Итак, как мне заставить PhpStorm автоматически завершить объект STD

Надеюсь, кто-то знает, как!

PS: Если вы думаете о лучшем способе сохранения значения $_POST, дайте мне знать!

Код:

$errors = 0;

$mandatory = [
    'first_name' => $_POST['first_name'],
    'last_name' => $_POST['last_name'],
    ];

$mandatory = json_decode(json_encode($mandatory));

$mandatory->

Phpstorm Screenshot

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Вы можете создать класс

<?php

class formFields
{
  private $first_name;
  private $last_name;

  public function __construct($first_name, $last_name)
  {
    $this->first_name = $first_name;
    $this->last_name = $last_name;
  }

  /**
   * @return mixed
   */
  public function getFirstName()
  {
    return $this->first_name;
  }

  /**
   * @return mixed
   */
  public function getLastName()
  {
    return $this->last_name;
  }

  /**
   * @param mixed $first_name
   */
  public function setFirstName($first_name)
  {
    $this->first_name = $first_name;
  }

  /**
   * @param mixed $last_name
   */
  public function setLastName($last_name)
  {
    $this->last_name = $last_name;
  }
}
0 голосов
/ 13 ноября 2018

Объекты типа stdClass не имеют стандартных свойств, только пользовательские. Таким образом, у PhpStorm нет никакого очевидного способа выяснить, что предложить. Даже у человека будут проблемы, так как ваш код поступает из внешнего ввода, таким образом, может содержать что угодно.

Взлом с помощью заглушек может быть способом, но это повлияет на всю кодовую базу.

Возможное решение - объявить пользовательский объект в любом месте вашего проекта (код должен быть проанализирован PhpStorm, его даже не нужно выполнять):

class MandatoryPost extends stdClass
{
    /**
     * @var string
     */
    public $first_name;

    /**
     * @var string
     */
    public $last_name;
}

& hellip; и предоставить некоторые подсказки здесь и там:

/** @var MandatoryPost $mandatory */
$mandatory->

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

$user = User::createFromPost($_POST);
if ($user->isComplete()) {
}

... или просто все время работать с простыми массивами.

0 голосов
/ 13 ноября 2018

Я ищу чистый путь

Я пытаюсь сделать объект STD

Эти предложения являются взаимоисключающими. Если вы хотите сделать его более понятным, создайте свой собственный класс для этих данных и заполните его ex. используя гидратор.

Я не знаю точно, где вы хотите сохранить его, но у вас есть много вариантов. Например, вы можете сериализовать объект.

Если вы хотите использовать «путь массива», вы можете использовать эту простую функцию

function checkMandatory(array $mandatoryFields, array $array) {
     return !array_diff_key(array_flip(mandatoryFields), $array);
}

использование

var_dump(checkMandatory(['first_name', 'last_name'], $_POST));
...