Метод isWritable
Метод isWritable класса PropertyAccessor проверяет,
можно ли записать значение в свойство объекта или в элемент массива.
Первым параметром передаётся объект или массив, вторым - путь
к свойству в виде строки. Метод возвращает true,
если запись возможна, и false в противном случае.
Метод удобно использовать перед вызовом setValue,
чтобы избежать исключения NoSuchPropertyException.
Синтаксис
$accessor->isWritable(object|array $object, string $path): bool
Пример
Давайте создадим объект с публичным свойством и проверим, можно ли в него записать значение:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PropertyAccess\PropertyAccess;
class ArticleController extends AbstractController
{
public function index(): Response
{
$article = new class {
public string $title = 'abcde';
};
$accessor = PropertyAccess::createPropertyAccessor();
$res = $accessor->isWritable($article, 'title');
return new Response(var_export($res, true));
}
}
?>
Результат выполнения кода:
true
Пример
Давайте проверим свойство, которого нет у объекта:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PropertyAccess\PropertyAccess;
class ArticleController extends AbstractController
{
public function index(): Response
{
$article = new class {
public string $title = 'abcde';
};
$accessor = PropertyAccess::createPropertyAccessor();
$res = $accessor->isWritable($article, 'text');
return new Response(var_export($res, true));
}
}
?>
Результат выполнения кода:
false
Пример
Давайте проверим элемент массива:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PropertyAccess\PropertyAccess;
class ArticleController extends AbstractController
{
public function index(): Response
{
$article = ['title' => 'abcde', 'text' => 'hello'];
$accessor = PropertyAccess::createPropertyAccessor();
$res = $accessor->isWritable($article, '[title]');
return new Response(var_export($res, true));
}
}
?>
Результат выполнения кода:
true
Пример
Давайте проверим объект с закрытым свойством без сеттера:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PropertyAccess\PropertyAccess;
class ArticleController extends AbstractController
{
public function index(): Response
{
$article = new class {
private string $title = 'abcde';
};
$accessor = PropertyAccess::createPropertyAccessor();
$res = $accessor->isWritable($article, 'title');
return new Response(var_export($res, true));
}
}
?>
Результат выполнения кода:
false
Смотрите также
-
метод
setValue,
который записывает значение в свойство -
метод
getValue,
который читает значение свойства -
метод
isReadable,
который проверяет возможность чтения свойства -
класс
PropertyAccessor,
который предоставляет доступ к свойствам объектов и массивов