질문을 삭제하지 말아주세요.!
 
1
0
-1

안녕하세요. 같은 클래스 안에 함수 안에 위치한 변수를 호출하고 싶습니다.

제가 한 소스는

index.php
<?php
require_once("./controller/autoload.php");

$dbCon = new database(); 
database.php
<?php
class database {
    protected const USER = "root";
    protected const PASSWORD = "xodnd7675";
    protected const HOST = "localhost";
    protected const NAME = "portfolio";
    public function __construct() {
        $connect = new mysqli(self::HOST, self::USER, self::PASSWORD, self::NAME);
    }


    public function sql_query($sql) {
        $result = $this->__construct()->$connect->query($sql);
        return $result;
    }


    public function __destruct() {
        $this->__construct()->$connect->close();
    }
}




이 소스인데


Notice: Undefined variable: connect in C:\webServer\apache2\htdocs\controller\database.controller.php on line 19

Notice: Trying to get property of non-object in C:\webServer\apache2\htdocs\controller\database.controller.php on line 19

Fatal error: Uncaught Error: Call to a member function close() on null in C:\webServer\apache2\htdocs\controller\database.controller.php:19 Stack trace: #0 C:\webServer\apache2\htdocs\controller\controller.controller.php(15): database->__destruct() #1 C:\webServer\apache2\htdocs\index.php(19): controller->load('index') #2 {main} thrown in C:\webServer\apache2\htdocs\controller\database.controller.php on line 19

에러가 뜹니다.



    CommentAdd your comment...

    2 answers

    1.  
      1
      0
      -1
      함수 안에 정의된 지역변수에 접근할 수는 없습니다.

      클래스 프로퍼티를 선언(http://php.net/manual/kr/language.oop5.properties.php)하시고,

      클래스의 인스턴스가 만들어질 때 호출되는 __construct() 함수 안에서 이 프로퍼티에 new로 할당하시면 되겠습니다.


      참고로,

      $this->__construct()->xxx와 같이 쓰셨는데,
      어떤 함수가 됐든 그 함수에서 객체를 return해야  -> (객체 연산자)를 사용할 수 있습니다.


      1. 김태웅

        답변 감사합니다.


        어.. 결국은 해결했습니다. 시간은 꽤 걸렸긴 했네요

         $result = $this->__construct()->$connect->query($sql);

        이걸

        $result = $this→__construct()→query($sql);

        로 하니 됩니다.

      CommentAdd your comment...
    2.  
      1
      0
      -1

      상수 선언 앞에 protected와 같은 접근 제한자를 붙일 수 있다는 사실을 처음 알았습니다. 고맙습니다.

      $this->__construct()와 같은 용법은 작동할 지 몰라도 PHP에서는 쓰지 않습니다. 라고 쓰고 보니, Symfony에서 쓰고 있네요. Symfony 프레임워크 전체를 통틀어서 딱 한군데입니다.

      https://github.com/symfony/http-kernel/blob/master/Kernel.php#L809


        CommentAdd your comment...