2012-06-18 4 views
0

이것은 PHP로 인해 당분간 괴롭힘을 당했고 아직 어떻게해야하는지 알 수 없습니다. 기본적으로 내 SQL 클래스의 순간에 나는 배열에 결과를 덤핑하고있어이 같은 무언가를 제공하는 객체로 변환 :새 클래스에 배열 적용 PHP

$first_post = $Post->find(1); 

(I도 같이 할 수있는 구문을 얻으려고 노력 했어요 : $ 포스트 : (1) 발견,하지만 완전히 다른 순수하게 미학적 문제의)

을 그리고 당신은과 같이 first_post 사용할 수 있습니다

$first_post->title; 

이 그냥 $post->find(1)의 내용을 변환하여 수행됩니다 그런 대상에 :

$first_post = (object) array("title" => "blah"); 

그리고 나는 새로운 STDClass를 인스턴스화하지만 그 STDClass의 새 인스턴스에 메소드를 바인딩하는 방법을 알아낼 수 없다는 것을 알고 있습니다. 주로 다음과 같은 작업을 할 수 있습니다.

$posts = $Post->all(); 
$last_post = $posts->last(); 
$specific = $posts->find("name" => "hello"); 

어떻게하면 이런 식으로 PHP를 얻을 수 있습니까?

+3

"순수하게 미적 문제": 전혀 아닙니다. 그것의 접근 범위를 바꾸는 것. – Gordon

+0

나는 알고있다. 나는 그 코드가 더 잘 보이도록하기위한 변경을 의미했다. – andy

+0

* (팁) * http://kore-nordmann.de/blog/0103_static_considered_harmful.html – Gordon

답변

1

(나는 또한처럼 보이도록 구문을 얻기 위해 노력했습니다 : $ 포스트 :: (1 찾을)하지만 그건 완전히 다른 순수하게 미학적 문제입니다)

범위 분석 연산자를 사용하는 경우 정적 메서드 및/또는 상수에 액세스하고 있습니다. 이것들은 클래스의 인스턴스보다는 클래스에서 작동하는 메소드입니다. 예를 들어 :

배열에서 게시물에 대한 객체를 생성에 관해서는
// the find method retuns a new Post instance and 
// does not try to access $this 
$post = Post::find(1); 

, 그것 중 하나를 자신의 Post 클래스를 생성하고 그에 따라 그것을 채우거나 같은 테이블 데이터를 반환 데이터베이스 함수 중 하나를 사용하는 것이 아마 더 낫다 배열보다 객체가 mysqli_result::fetch_object 또는 mysql_fetch_object입니다. 자신의 포스트 클래스를 만드는 경우

, 당신은 배열의 데이터베이스 정보를 저장하고 __call(), __get()__get()Magic Methods 해당 데이터에 액세스하는 데 사용할 수 있습니다. 예를 들면 :

class Post() { 
    protected $data; 

    public function __construct($data) { 
     $this->data = $data; 
    } 

    // access data with a getFoobar() style call 
    public function __call($name, $args) { 
     if (substr($name, 0, 3) == 'get') { 
      $key = strtolower(substr($name, 3)); 
      if (array_key_exists($key, $this->data)) { 
       return $this->data[$key]; 
      } 
     } 

     $class = get_class($this); 
     throw new Exception("Call to undefined method $class::$name"); 
    } 

    // access data like a class property 
    public function __get($key) { 
     if (array_key_exists($key, $this->data)) { 
      return $this->data[$key]; 
     } 

     throw new Exception("Attempt to access non-existant property $class::$name"); 
    } 

    // set the data like a class property 
    public function __set($name, $value) { 
     $this->data[$name] = $value; 
    } 
} 
0

할 수 있습니다 있지만 각 인스턴스에서 그것을마다 할 필요가있을 것이다 :

does'nt 일 이상 확인
$obj = new stdClass(); 
$obj->myMethod = function($name) {echo 'Hello '.$name;}; 

... 내가 successfuly 문서에서이 방법을 사용하는 그래도 같은 라인을 따라했다있다 : http://uk3.php.net/manual/en/reserved.classes.php#105404

+0

내가 알 수있는 한, 그것은 작동하지 않습니다. 이 '모델'객체가 동적으로 만들어지기 때문에 각각의 인스턴스화 작업을 할 때마다 코드를 추가해야 할 필요가 있습니다. – andy

0

나는 그것을 배열로 모든 게시물 및 저장을 얻을 수 인스턴스화 할 때 당신이 Post 클래스

을 만들 수있을 것 같아요.

지정된 쿼리에 대한 모든 게시물을 검색하는 find 메서드가있을 수 있습니다.

또한 마지막 항목 또는 첫 번째 항목을 각각 얻는 마지막 및 첫 번째 방법을 가질 수 있습니다.

__get 메서드를 사용하여 동적으로 클래스 속성을 만들 수 있다고 생각합니다. 이것은 속성 이름을 받아들입니다. 게시물 배열을 검색하여 값이 있으면 반환 할 수 있습니다. 당신이 동적으로 자바 스크립트 방법을 추가 할 수 있습니다로

Can you create instance properties dynamically in PHP?

+0

흠, 내가 현재하고있는 방법입니다. 내가 편집하고 싶은 유일한 이유는 프레임 워크에서 결과를 '데이지 체인'할 수 있기 때문입니다. 그러면 다음과 같이 할 수 있습니다 : $ post-> like ($ username) -> 찾기 ("password"=> $ password) -> first(); – andy

+1

@andy 클래스 인스턴스 '$ this'를 반환 할 수 없습니까? 따라서 각 함수 결과는'results' 속성에 추가 될 수 있습니다. 그런 다음 사용자는'execute()'를 호출하거나 실제 결과를 반환 할 필요가 있습니까? – dm03514

+0

가능합니다. 나는 그것을 조사해야 할 것이다. – andy

1

당신은 StdClass에 방법을 바인딩 할 수 없습니다.

원하는 방법으로 클래스를 만들어야합니다. (다른 클래스에 공통적 인 메소드가있는 경우 extends 또는 trait을 사용할 수 있습니다.)

예를 들어

:

class Post 
{ 
    static function find() 
    { 
     $post = new Post(); 
     $array = array('title' => 'First Post'); 
     foreach ($array as $key => $value) 
     { 
      $post->$key = $value; 
     } 
     return $post; 
    } 

    public function do_something() 
    { 
     echo $this->title; 
     return $this; 
    } 
} 
0

당신이 데이터베이스에서 데이터를 검색이 방법 PDOStatement::setFetchMode보고 PDO를 사용하는 경우. 결과의 각 행에 대해 PDO::FETCH_CLASS을 사용하여 새 클래스를 인스턴스화하도록 PDO에 지시 할 수 있습니다. 정확한 방법의 정의는 다음과 같다 :

bool PDOStatement::setFetchMode (int $PDO::FETCH_CLASS , string $classname , array $ctorargs) 

하고 상황에 넣어하기 :

namespace My\Web; 

class Post { 
    public function __construct($arg) { 
     var_dump($arg); 
    } 

    public function getTitle() { 
     return $this->title; 
    } 

    public function getFormatedContent() { 
     return whatever($this->content); 
    } 
} 

가져 오는 객체 : 그래서 당신은 것입니다 내가 무엇을 보여주기 위해 노력하고

$stmt = $conn->query($sql); 
$posts = $stmt->setFetchMode(PDO::FETCH_CLASS, 'My\Web\Post', array(rand())); 
print_r($posts); 
// print array of My\Web\Post objects, each will print some random number in it's constructor. 

속성 배열을 stdClass로 변환 한 다음 일부 메서드를 바인딩 할 필요가 없습니다.
필요에 따라 클래스를 생성하고 PDO가 해당 클래스로 쿼리 결과를 래핑하도록 할 수 있습니다.

Doctrine DBAL에서도 작동합니다 (PDO 상단에 내장되어 있기 때문에).