Php 是否提供标识符的可读表示?
作为我要求解决一个坏问题的后续行动,我试图找到一种以“可读”的方式表达任意标识符的方法 上下文:我们正在处理具有标识的实体(来自的域模型对象)。此标识(映射到数据库主键)可以表示为字符串:Php 是否提供标识符的可读表示?,php,orm,domain-driven-design,identity,identifier,Php,Orm,Domain Driven Design,Identity,Identifier,作为我要求解决一个坏问题的后续行动,我试图找到一种以“可读”的方式表达任意标识符的方法 上下文:我们正在处理具有标识的实体(来自的域模型对象)。此标识(映射到数据库主键)可以表示为字符串:'123','ABC' 某些实体可以具有复合标识,即由两个或多个其他实体的标识组成:array('123','ABC') 有时,我们希望漂亮地打印此标识,或者在只允许单个字符串的位置使用它(例如,在HTML值中)。该过程必须是可预测和可逆的,即如何将其恢复到原始状态,不应存在任何歧义 当我们想要人工读取此标识时
'123'
,'ABC'
某些实体可以具有复合标识,即由两个或多个其他实体的标识组成:array('123','ABC')
有时,我们希望漂亮地打印此标识,或者在只允许单个字符串的位置使用它(例如,在HTML
值中)。该过程必须是可预测和可逆的,即如何将其恢复到原始状态,不应存在任何歧义
当我们想要人工读取此标识时,出于调试目的,更容易读取123
、ABC
或123~ABC
,而不是a:2:{i:0;s:3:123;i:1;s:3:“ABC”}
,这就是为什么我们不想使用内置函数,例如serialize()
或json\u encode>
json_encode()做得很好,但在HTML中使用它时,引号必须正确编码,它变得非常不可读:
<option value="["123","ABC"]">
我们可以使用一种很好的格式,就像这样:
<option value="123~ABC">
在发布HTML表单时,我们必须能够将此编码标识还原为其原始状态:array('123','ABC')
以检索正确的实体
最后,如果身份包含除字母和数字以外的其他字符,则格式变得复杂(人类)读取是完全可以接受的
一些基本例子:
'123'
=>'123'
'ABC'
=>'ABC'
array('123','ABC')
=>'123~ABC'
(只是一个想法)
'带有非字母数字、甚至非字符$的字符串
=>?
对于包含其他字符的字符串,任何(或多或少复杂的)表示都是可以接受的。结果字符串应仅包含ASCII字符,即使原始字符串包含非ASCII字符。整个过程必须是完全可逆的
你知道怎么做吗
str_replace( array('[',']','"',',') ,
array('','','','~'),
json_encode($stuff)
);
您的问题非常冗长,无法解释您真正想要实现的目标。根据您在评论中给出的反馈,我建议您使用或对标识符原子进行编码
然后可以使用,
冒号创建原子合成
class Identifier {
static function encode(array $identifier) {
return implode(', ', array_map('rawurlencode', $identifier));
}
static function decode($identifier) {
return array_map('rawurldecode',
array_map('trim', explode(',', $identifier))
);
}
}
$identifier = array('111', 'abc');
var_dump($identifier);
$encoded = Identifier::encode($identifier);
var_dump($encoded);
$decoded = Identifier::decode($encoded);
var_dump($decoded);
您可以使用2个特殊字符:
~
-分隔符
*
-转义字符(转义分隔符或转义字符本身)
示例:
array('123','ABC') => 123~ABC
array('12*3','A~BC') => 12**3~A*~BC
您可以为分隔符和转义符选择不同的字符。如果所选字符很少可用,则字符串通常可读性良好。实体的有效字符是什么?任何字符对标识都是有效的,就像在数据库字符串主键中一样。但在现实生活中,它大部分时间是由可读字符组成的。这就是为什么编码应该同时容纳这两个字符。那么你在谈论哪个字符集呢?它可以用Unicode代码点表示吗?很好。字符集应该无关紧要。如果原始字符串包含非ASCII字符,那么对其进行编码以使其也适合ASCII字符集也是一个很好的解决方案。我更新了我的问题以反映这一点。lol,与中的注释正好相反,这解释了详细性。我想它确实很好地解释了我想要实现的目标,我只是在问题中添加了另一句话,也许不是那么明显:“当发布HTML表单时,当必须能够将其还原到原始状态以检索正确的实体时”。关于你的代码,你没有解释你是如何将其反转的?@Benjamin:编辑你的问题(删除所有内容)并发布一系列示例以及你想要如何转换它。我也会根据你的建议编辑我的答案。谢谢你的建议,我会添加一些例子,但不会删除这个问题。上一个问题的人确实想了解问题的背景。这是一个非常有趣和简单的方法,它确实解决了上面所表达的问题,谢谢!感谢您编写了这段优秀的代码,它非常罕见,足以突出显示它。我只需删除逗号后的空格(在我看来不太有用),这似乎完美地解决了我的问题:返回内爆(',',array_map('rawurlencode',$identifier))
和返回数组_映射('rawurldecode',explode(',',$identifier))代码>。考虑其他人可能在文件中编辑这些标识符,并可能添加空白。因此,修剪。输出严格,但接受输入不严格。我看不出用户必须编辑标识符的用例,但为什么不,我理解你的观点。这两种方法都是有效的,尽管我可能倾向于最简单的一种,对于人类可读性需求(人类可写性目前还不是一个问题)。非常感谢你的帮助,这是一份出色的工作!类用作命名空间?这是一个否定:)