728x90

PHP 변수지정 기초지식


PHP 개발자가 알아야 할 기초적인 지식을 이해하기 쉽게 정리를 했다.

모든 개발에 있어서 실력을 키우는 가장 빠른 방법은 좋은말로 "벤치마킹" 나쁜말로 "모방" 이다.

좋든 나쁘든 가장 빠른 방법임에는 확실하다.
언어는 눈으로 배우는 것이 아니라 직접 경험을 통해 "깨달음" 이 있어야만 자기 것이 된다.

책을 통해 배우거나, 인터넷을 검색하거나, 공개소스를 살펴보거나, 중요한 것은 직접 코딩하고 원리를 이해해 가는 것이다.


변수 : 결과가 바뀔수 있게 할 수 있는 수, 변하는 수, 변할 수 있는 수

         오늘 비가 온다는 예보가 있는데 야구장을 가야하나 말아야 하나.. 오늘의 변수날씨구나..

<?php
$날씨 = '맑음';
if ($날씨 == '비')
{
     echo '우천취소';
}
else {
     echo '야구 정상적으로 진행';
}
?>



1. 변수를 정의할때 반드시 정확한 자료형을 사용한다.

2. 문자열 변수를 정의할때 "상수나 변수를 포함할 것으로 의도하지 않는한" 문자열은 무조건 홑따옴표로 감싸준다.

$array['constant'] = '연관배열';

PHP 해석기는 constant 가 상수가 아니라 "문자열" 이라는 것을 미리 알고 모든 상수중에 constant 를 찾아 헤매는 헛수고를 하지 않는다.

구분

 잘못된 거

올바른 거

 문자열 변수

$string1 = "문자열1";

$string2 = '문자열2';

 정수형 변수

 $int = "1";

 $int = 1;


정수형 변수를 정의하든 문자열변수를 정의하든 습관적으로 쌍따옴표를 사용하는 경우가 많은데 이것은 반드시 당장 고쳐야 할 나쁜 습관이다.


PHP해석기는 위의 두 변수를 메모리에 담을때 완전히 다른 작업을 하는데

$string1"문자열1" 에 변수나 상수가 포함되어 있는지 먼저 찾아내는 작업을 수행한다.

그리고 나서 변수/상수 값에 대한 치환작업을 한 후에야 그 결과값을 $string1 에 담는다.


$string2 은 '문자열2' 이라는 문자열에 대해서 어떠한 작업도 없이 곧바로 $string2 변수에 담는다.


다음 두 개의 SQL 문 처리를 살펴보자. 어떤 걸 써야 할까?

$sql = 'SELECT * FROM $usertable WHERE PartNumber = $partid';
$sql = "SELECT * FROM $usertable WHERE PartNumber = $partid";


"(쌍따옴표)는 변수를 해석할 수 있다. 하지만 '(홀따옴표)는 변수를 해석하지 못한다.

홀따옴표로 감싸진 전체를 문자열로 인식하기 때문이다.

이 경우에는

$sql = "SELECT * FROM $usertable WHERE PartNumber = '$partid' ";

와 같이 명확하게 Strings에 대해 홀따옴표(single quotes)로 변수를 표시해라.

아니면 아래와 같이 string 형 변수와 integer변수를 명확하게 구분하여 처리하면 전혀 문제되지 않는다.

$sql = 'SELECT * FROM '.$usertable.' WHERE string_column = "'.$string.'" AND integer_column = '.$number.';


Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result ...

와 같은 경고 메시지가 나온다면 어떻게 해야 할까?

$sql 문에 문제가 없는지 echo $sql.'<br/>'; 로 내가 원하는 SQL문으로 만들어지고 있는지 확인하시라.

홀따옴표, 쌍따옴표 관련 처리가 잘못되어 원하는 문자열로 해석되지 않고 있을 수 있다.


내가 사용하는 코딩 예시이다.

<?php
if (!isset($_SESSION)) {
    session_start();
}
// 파일을 직접 실행하면 동작되지 않도록 하기 위해서
if(isset($_POST) && $_SERVER['REQUEST_METHOD'] == "POST"){
    @extract($_POST); // $_POST['loginID'] 라고 쓰지 않고, $loginID 라고 써도 인식되게 함
    header('Content-Type: application/json; charset=utf8');
    if(isset($userID) && !empty($userID) && isset($password) && !empty($password)) {
        include_once 'dbController.php';
        require_once 'loginClass.php';
        $c=new LoginClass;
        $user = $c->getUser($userID, $password); // LoginClass에 함수가 정의되어 있다.

        if (is_array($user)) {
            $_SESSION['userID'] = $user['userID'];
            $_SESSION['userNM'] = $user['userNM'];
            $_SESSION['admin'] = $user['admin'];
            echo json_encode(array('result' => '1'));
        } else {
            echo json_encode(array('result' => '0'));
        }
    } else {// 입력받은 데이터에 문제가 있을 경우
        echo json_encode(array('result' => '-2'));
    }
}
?>



상수 : 이미 정해져 있는 불변의 값을 의미한다.

          define("상수명","정의값");

    define('constant','a');
    define('constant','b');

    변수는 처음 선언한 a가 변경되어 b가 되지만, 상수는 여전히 a로 유지된다.


PHP에서 미리 지정한 값을 가지는 것을 상수라고 한다(PHP에서 지정한 상수는 아주많다)
사용자가 지정한 상수도 있다.(define 함수를 이용해서 지정할 수 있다.)

상수명은 일반적으로 대문자를 사용한다.

<html>
    <head>
        <title>constant Test</title>
        <meta charset="UTF-8">
        <meta name="robots" content="noindex,nofollow"/>
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <meta http-equiv="cache-control" content="no-cache" />
        <meta http-equiv="expires" content="0" />
        <meta http-equiv="pragma" content="no-cache" />
    </head>
    <body>
    <?php
        // PHP_VERSION : PHP 버전 지정한 상수
        // true(참), false(거짓), null(아무값이 없음)
        // PHP_OS : PHP가 실행중인 OS설명하는 상수
        // __LINE__ : 처리중에 있는 파일의 현재 줄 번호
        // __FILE__ : 처리중에 있는 파일의 전체 경로와 이름
        // __DIR__ : 처리중에 있는 파일의 디렉토리
        // __FUNCTION__ : 함수명
        // __CLASS__ : 클래스명
        // __TRAIT__ :  트레이트명
        // __METHOD__ : 클래스의 메소드명
        // __NAMESPACE__ : 현재 네임스페이스 이름

        //사용예 : define("상수명", "정의값");

        define("HI", "안녕!!");
        print HI;
        print '<br />';

        print "현재 사용중인 PHP 버전은 ? ";
        print PHP_VERSION;

        print "<br/> 이 파일의 이름은?  ";
        print __FILE__;

        print "<br/> 수행 중에 있는 코드 라인넘버는?  ";
        print __LINE__;
    ?>
    </body>
</html>



배열 : 일정한 규격에 따라 분리되어진 집합

          김밥 한줄을 썰어서 10조각이 나왔다. 썰어진 김밥은 배열이다. 김밥[0] 은 첫번째 김밥 조각이다.

          - 배열 선언을 $a =[] ; // 배열 초기화 (PHP 5.4 이상 버전에서만 사용할 수 있다)

          - 배열은 인덱스를 사용하지만, 연관 배열은 key 를 사용한다.

          - array("키" => "값") PHP 5.4 이상에서 사용가능


연관배열을 사용하는 예로 가장 흔하게 사용하는 것이 dbconnect.php 에서 DB연결하는 배열인 연관배열 선언하는 것이다.

$db['host'] = "localhost";
$db['name'] = "address";
$db['user'] = "address_root";
$db['pass'] = "autoset";
$db['port'] = "3306";


$dbconn = isConnectDb($db);

function isConnectDb($db){
    $conn = mysqli_connect($db['host'],$db['user'],$db['pass'],$db['name'],$db['port']);
    mysqli_set_charset($conn, "utf8"); 
    if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
        exit;
    } else {
        return $conn;
    }
}


연관배열의 다른 예제

$data = array('name' => '홍길동', 'age' =>20, 'address'=>'서울');
print $data['name']." | ";
print $data['age']." | ";
print $data['address'];


다차원 배열 예제

//PHP 5.4 이상 버전에서 사용 가능
$member1[] = ['name'=>'홍길동', 'age'=>32, 'tel' => '010-1111-2222'];
print $member1[0]['name'];



함수 : 주어진 변수가 정해진 관계식에 대입된 상황 (결과)
객체 : 모든 사물,동작 등에 접근할 수 있도록 구조화한 형체 (개념)

          자동차는 바퀴,핸들,시트,달리다 로 표현할 수 있다. 바퀴는 자동차를 위한 객체이다.

728x90

'Web 프로그램 > PHP 문법' 카테고리의 다른 글

[PHP문법] array (배열)  (0) 2015.03.04
[PHP기초] switch 문  (0) 2015.03.03
[PHP기초] PHP 파일 다루기  (0) 2014.11.28
[PHP기초] fopen 파일 열기  (0) 2014.09.11
[PHP] 문자열 치환하기  (0) 2014.05.10
블로그 이미지

Link2Me

,