PHP의 Structs 데이터 유형?
누구든지 PHP에서 구조체 데이터 유형에 대한 예제를 줄 수 있습니까? 어떻게 갑자기 PHP의 구조체와 같은 것이 있습니까?
구조체에 가장 가까운 것은 모든 멤버가 public 인 객체입니다.
class MyStruct {
public $foo;
public $bar;
}
$obj = new MyStruct();
$obj->foo = 'Hello';
$obj->bar = 'World';
PHP 클래스 문서 를 보는 것이 그만한 가치가 있다고 말하고 싶습니다 . 일회성 구조체가 필요한 경우 alex의 답변에서 언급 한대로 StdObject를 사용하십시오 .
배열을 사용할 수 있습니다.
$something = array(
'key' => 'value',
'key2' => 'value2'
);
또는 표준 개체와 함께.
$something = new StdClass();
$something->key = 'value';
$something->key2 = 'value2';
두 가지를 추천합니다. 첫 번째는 연관 배열 입니다.
$person = Array();
$person['name'] = "Joe";
$person['age'] = 22;
두 번째는 수업 입니다.
여기에 자세한 문서 : http://php.net/manual/en/language.oop5.php
나는 오늘 '동적'구조체 클래스를 함께 만들었고, 오늘 밤을 보았고 누군가 생성자 매개 변수를 더 잘 처리하여 비슷한 것을 작성했습니다. 살펴볼 가치가 있습니다.
http://code.activestate.com/recipes/577160-php-struct-port/
이 페이지의 주석 중 하나는 PHP에서 흥미로운 점을 언급합니다. C에서 Struct 포인터를 사용하는 것처럼 화살표 표기법을 사용하여 배열 요소를 참조 할 수 있도록 배열을 객체로 캐스팅 할 수 있습니다. 코멘트의 예는 다음과 같습니다.
$z = array('foo' => 1, 'bar' => true, 'baz' => array(1,2,3));
//accessing values as properties
$y = (object)$z;
echo $y->foo;
아직 직접 시도해 보지는 않았지만 캐스팅 만하면 원하는 표기법을 얻을 수있을 것입니다. 물론 이것들은 '동적'데이터 구조이며 해시의 키 / 값 쌍에 액세스하기위한 구문 설탕 일뿐입니다.
실제로 더 정적으로 입력 된 것을 찾고 있다면 ASpencer의 대답은 찾고있는 드로이드입니다 (Obi-Wan이 말할 수 있음).
struct
데이터 유형이 SOAP에서 일반적으로 사용되는 것 같습니다 .
var_dump($client->__getTypes());
array(52) {
[0] =>
string(43) "struct Bank {\n string Code;\n string Name;\n}"
}
이것은 네이티브 PHP 데이터 유형이 아닙니다!
struct
SOAP에서 참조 되는 유형 의 속성은 간단한 PHP stdClass
객체 로 액세스 할 수있는 것 같습니다.
$some_struct = $client->SomeMethod();
echo 'Name: ' . $some_struct->Name;
연관 배열 만 PHP의 구조체입니다.
그리고 당신은 그것들을 스스로 엄격하게 만들 수 없습니다.
그러나 클래스와 인터페이스를 사용하여 일종의 가짜 구조 엄격 성을 가질 수 있지만 구조와 달리 클래스 인스턴스는 인수로 전달되지 않으며 식별자는 !
인터페이스를 통해 (또는 적어도 그에 가까운) 구조체를 정의 할 수 있습니다.
구조체는 객체에 특정 구조를 적용합니다.
PHP (<= 7.3)에는 네이티브 구조체가 없지만 인터페이스 및 유형 힌트를 사용하여 해결할 수 있습니다.
interface FooStruct
{
public function name() : string;
}
interface BarStruct
{
public function id() : int;
}
interface MyStruct
{
public function foo() : FooStruct;
public function bar() : BarStruct;
}
구현하는 모든 클래스 MyStruct
는 MyStruct
.
빌드되는 방식은 구조체에 달려 있지 않고 반환 된 데이터가 올바른지 확인합니다.
데이터 설정은 어떻습니까?
우리가 getter 및 setter와에 가까운 그것의 무언가와 끝까지 같이 구조체의 데이터를 설정하는 것은 문제가 빈혈 개체 또는 DTO 하고 일부 사람들이 안티 패턴을 고려
잘못된 예 :
interface FooStruct
{
public function getName() : string;
public function setName(string $value) : FooStruct;
}
interface BarStruct
{
public function getId() : int;
public function setId(int $value) : BarStruct;
}
interface MyStruct
{
public function getFoo() : FooStruct;
public function setFoo(FooStruct $value) : MyStruct;
public function getBar() : BarStruct;
public function setBar(BarStruct $value) : MyStruct;
}
그럼 우리가 변경할 수 있습니다 클래스 구현과 끝, 그리고해야하지 따라 변이 이것이 구조체는 단지 같은 "데이터 형식"하기 위해 int
, string
. 그러나 PHP의 인터페이스로 제한 할 수있는 방법이 없습니다. 즉, 사람들이 구조체가 아닌 클래스에서 구조체 인터페이스를 구현할 수 있습니다. 인스턴스를 유지해야합니다. 변경 불가능
또한 구조체는 올바른 데이터없이 인스턴스화되고 데이터에 액세스하려고 할 때 오류를 트리거 할 수 있습니다.
PHP struct 클래스에서 데이터를 설정하는 쉽고 안정적인 방법은 생성자를 사용하는 것입니다.
interface FooStruct
{
public function name() : string;
}
interface BarStruct
{
public function id() : int;
}
interface MyStruct
{
public function foo() : FooStruct;
public function bar() : BarStruct;
}
class Foo implements FooStruct
{
protected $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function name() : string
{
return $this->name;
}
}
class Bar implements BarStruct
{
protected $id;
public function __construct(string $id)
{
$this->id = $id;
}
public function id() : int
{
return $this->id;
}
}
class My implements MyStruct
{
protected $foo, $bar;
public function __construct(FooStruct $foo, BarStruct $bar)
{
$this->foo = $foo;
$this->bar = $bar;
}
public function foo() : FooStruct
{
return $this->foo;
}
public function bar() : BarStruct
{
return $this->bar;
}
}
인터페이스를 사용하여 힌트 입력 : (IDE에서 지원하는 경우)
엄격한 유형 검사를하지 않아도 괜찮다면 IDE에 대한 주석이있는 인터페이스 나 클래스를 사용하는 것도 다른 방법입니다.
/**
* Interface My
* @property Foo $foo
* @property Bar $bar
*/
interface My
{
}
/**
* Interface Foo
* @property string|integer $id
* @property string $name
*/
interface Foo
{
}
/**
* Interface Bar
* @property integer $id
*/
interface Bar
{
}
The reason to use interfaces instead of classes is for the same reason why interfaces exist in the first place, because then many classes with many implementations can have this same structure and each method/function that uses it will support every class with this interface.
This depends on your IDE, so you might need to use classes instead or just live without it.
Note: Remember that you have to validate/sanitize the data in the instance elsewhere in the code to match the comment.
참고URL : https://stackoverflow.com/questions/3861353/structs-data-type-in-php
'IT박스' 카테고리의 다른 글
Promise catch에서 오류 다시 던지기 (0) | 2020.11.15 |
---|---|
함수에서 char *와 char []를 반환하는 것의 차이점은 무엇입니까? (0) | 2020.11.15 |
객체 / 인스턴스 / 변수의 존재를 우아하게 확인하고 파이썬에 존재하는 경우 변수에 동시에 할당하는 방법은 무엇입니까? (0) | 2020.11.14 |
mysql : 소스 오류 2? (0) | 2020.11.14 |
사용자 정의 UserControl을 대화 상자로 어떻게 표시합니까? (0) | 2020.11.14 |