phrity / util-accessor
通过访问路径处理数据集访问的实用工具。
1.1.0
2024-07-29 14:57 UTC
Requires
- php: ^8.0
Requires (Dev)
- php-coveralls/php-coveralls: ^2.0
- phpunit/phpunit: ^9.0 | ^10.0 | ^11.0
- squizlabs/php_codesniffer: ^3.0
README
简介
通过访问路径处理数据集访问的实用工具。
安装
使用 Composer 安装;
composer require phrity/util-accessor
如何使用
基本操作 get()
和 has()
方法
任何数据集(包括数组、对象和标量值)都可以通过路径进行访问。
use Phrity\Util\Accessor; $subject = [ 'string-val' => 'A string', 'assoc-array-val' => [ 'string-val' => 'Another string', ], 'num-array-val' => [ 'a', ], 'object-val' => (object)[ 'string-val' => 'Yet another string', ], ]; $accessor = new Accessor(); $accessor->get($subject, 'string-val'); // => "A string" $accessor->get($subject, 'assoc-array-val'); // => ['string-val' => "Another string"] $accessor->get($subject, 'assoc-array-val/string-val'); // => "Another string" $accessor->get($subject, 'num-array-val/0'); // => "a" $accessor->get($subject, 'object-val/string-val'); // => "Yet another string" $accessor->has($subject, 'assoc-array-val/string-val'); // => true $accessor->has($subject, 'assoc-array-val/non-exising'); // => false
为 get()
方法指定默认返回值
get()
方法也可以指定默认值,当路径不匹配数据集时返回。如果未指定,在这些情况下将返回 null
。
use Phrity\Util\Accessor; $subject = [ 'string-val' => 'A string', ]; $accessor = new Accessor(); $accessor->get($subject, 'non-existing'); // => null $accessor->get($subject, 'non-existing', 'My default'); // => "My default"
set()
方法
set()
方法根据路径在数据集中添加或替换值。注意,此操作不合并值,而是显式设置。
根据作用域,可能无法在类属性上使用 set()
。在这种情况下将抛出 AccessorException
。
use Phrity\Util\Accessor; $subject = [ 'string-val' => 'A string', ]; $accessor = new Accessor(); $subject = $accessor->set($subject, 'string-val', 'Replaced value'); $subject = $accessor->set($subject, 'non-existing', 'Added value'); // $subject => ['string-val' => 'Replaced value', 'non-existing' => 'Added value']
指定路径分隔符
默认情况下,路径使用 /
作为分隔符。可选地,可以在构造函数中设置分隔符。
use Phrity\Util\Accessor; $subject = [ 'object-val' => (object)[ 'string-val' => 'A string', ], ]; $accessor = new Accessor('.'); $accessor->get($subject, 'object-val.string-val'); // => "A string" $accessor->has($subject, 'object-val.string-val'); // => true
路径访问器
如果应使用相同的路径访问多个数据集,则可以使用 PathAccessor。此时,路径在构造函数中指定,然后在所有对 get()
、has()
和 set()
的调用中使用。
use Phrity\Util\PathAccessor; $subject_1 = [ 'object-val' => (object)[ 'string-val' => 'A string', ], ]; $subject_2 = [ 'object-val' => (object)[ 'string-val' => 'Another string', ], ]; $accessor = new PathAccessor('object-val/string-val'); $accessor->get($subject_1); // => "A string" $accessor->get($subject_2); // => "Another string" $subject_1 = $accessor->set($subject_1, 'Replaced value'); $subject_2 = $accessor->set($subject_2, 'Replaced value');
数据访问器
如果应使用多个路径访问数据集,则可以使用 DataAccessor。此时,数据在构造函数中指定,然后在所有对 get()
、has()
和 set()
的调用中使用。
use Phrity\Util\DataAccessor; $subject = [ 'object-val' => (object)[ 'string-val' => 'A string', 'int-val' => 23, ], ]; $accessor = new DataAccessor(subject); $accessor->get('object-val/string-val'); // => "A string" $accessor->get('object-val/int-val'); // => 23 $accessor->set('object-val/string-val', 'Replaced string'); $accessor->set('object-val/int-val', 48);
我想将其纳入自己的类中
当然,没问题。只需在您的类中使用 AccessorTrait
,并调用可用的工作方法。内部递归工作方法将路径作为路径段的数组。还有一个辅助程序可以从字符串路径中提取数组路径。
use Phrity\Util\AccessorTrait; class MyClass { use AccessorTrait; public function doThings(): void { $my_data = ['array-val' => ['string-val' => 'A string']]; $exists = $this->accessorHas($my_data, ['array-val', 'string-val']); $something = $this->accessorGet($my_data, ['array-val', 'string-val'], 'My default'); $my_path = $this->accessorParsePath('array-val#string-val', '#'); $exists = $this->accessorHas($my_data, $my_path); $something = $this->accessorGet($my_data, $my_path, 'My default'); $modified = $this->accessorSet($my_data, $my_path, 'My new value'); } }