2014-10-09 6 views
0

다른 사람의 코드 작업 중입니다. 코드에는 하나의 함수가 있습니다.foreach 루프 내에서 개체의 인스턴스화

는 다음과 같다 :

function send_notification($device_token) 
{ 
    $apn = new APN(); 
    $apn->payloadMethod = 'enhance'; // you can turn on this method for debuggin purpose 
    $apn->connectToPush(); 
    ............................ 
    ............................ 
} 

다음 foreach 루프 내부에, 그는 함수를 호출합니다.

foreach($alluser as $user) 
{ 
    send_notification($user['device_token']); 
} 

위의 코드를 실행하면 APN Failed to connect: Something wrong with context가 표시됩니다.

그래서 코드에서 몇 가지 사항을 변경했습니다.

$apn = new APN(); 
foreach($alluser as $user) 
{ 
    $apn->payloadMethod = 'enhance'; // you can turn on this method for debuggin purpose 
    $apn->connectToPush(); 
    ............................ 
    ............................ 
} 

나는 foreach 루프 외부에서 클래스의 객체를 생성 한 다음 작동합니다.
하지만 wrost 것은 각 장소 (이 페이지는 다른 foreach가 포함되어 있음) 위에 코드를 써야합니다.

그래서 어떻게 위의 문제를 현명한 방법으로 해결할 수 있습니까?

FULL CODE (Just some part)

<?php 
foreach($alluser as $user) 
{ 
    send_notification($user['device_token']); 
} 

function send_notification($device_token) 
{ 
    $apn = new APN(); 
    $apn->payloadMethod = 'enhance'; // you can turn on this method for debuggin purpose 
    $apn->connectToPush(); 
    ............................ 
    ............................ 
} 
?> 

(!) 참고 : 나는 그때마다 클래스의 새 인스턴스를 만들 때 왜 작동하지 않습니다 알고하려고 무엇?

+2

클래스의 재 선언이 없습니다. 또한 마지막 노력이 효과가 있습니까? – sectus

+0

내가 무엇을 부르는지 모르겠다. 제목을 편집 할 수있다. foreach 루프에서 함수를 호출하면 매번 클래스의 새 인스턴스가 만들어진다. – DS9

+0

마지막 노력은 효과가 있습니까? – sectus

답변

1

다시하고 다시 객체를 만들 필요가 없습니다 만 전에 인스턴스화 고리.

<?php 
$apn = new APN(); 
foreach($alluser as $user) 
{ 
    send_notification($user['device_token'], $apn); 
} 

function send_notification($device_token, APN $apn) 
{ 
    $apn->payloadMethod = 'enhance'; // you can turn on this method for debuggin purpose 
    $apn->connectToPush(); 
    ............................ 
    ............................ 
} 

또 다른 방법은 싱글 사용하는 것입니다 다음 Singleton pattern도 열심히 테스트를하게 꽉 커플 링 등의 단점이 함께 제공하고 또한 종속 숨겨

class APN { 
    private static $instance = null; 
    public static function getInstance() { 
     if (null === self::$instance) { 
      self::$instance = new self; 
     } 
     return self::$instance; 
    } 
    //.... whatever your class does 
} 

foreach($alluser as $user) 
{ 
    send_notification($user['device_token'], $apn); 
} 

function send_notification($device_token) 
{ 
    $apn = APN::getInstance(); 
    $apn->payloadMethod = 'enhance'; // you can turn on this method for debuggin purpose 
    $apn->connectToPush(); 
    ............................ 
    ............................ 
} 

힘든 참고 :

Singleton Antipattern

제 제안은 첫 번째 접근 방법입니다.

+0

답변 해 주셔서 감사합니다. 그것은 쓸모있다. 하지만 내가 이해하지 못하는 것은 매번 수업의 새로운 인스턴스를 생성 한 다음 매번 작동하지 않는 이유입니다. – DS9

+0

이 경우 우리는 APN의 코드를 알아야합니다.어쩌면 기존 연결을 닫기 전에 두 번째 시간을 인스턴스화하지 못하게하는 잠금을 구현할 수도 있습니다. 하지만 여기서 나는 단지 짐작하고있다. – enricog

+0

[APN LIBRARY] (https://github.com/antongorodezkiy/codeigniter-apns/blob/master/application/library/apn.php) – DS9

1

사용 오브젝트를 사용할 수있는 글로벌 당신은 당신은 단지 APN 인스턴스 함수의 필수 매개 변수 만들 수있는 예를

<?php 
$apn = new APN(); 
foreach($alluser as $user) 
{ 
    send_notification($user['device_token']); 
} 

function send_notification($device_token) 
{ 
    global $apn; 
    $apn->payloadMethod = 'enhance'; // you can turn on this method for debuggin purpose 
    $apn->connectToPush(); 
    ............................ 
    ............................ 
} 
?> 
+0

코드를 디버깅하고 이해하는 데있어 전역 변수를 사용하지 마십시오. – enricog

관련 문제