var, let, const 차이점은?

  • var function-scoped이고, let, const block-scoped입니다.

  • function-scoped block-scoped가 무슨말이냐?

var(function-scoped)

jsfiddle 참고주소

// var는 function-scope이기 때문에 for문이 끝난다음에 i를 호출하면 값이 출력이 잘 된다.
// 이건 var가 hoisting이 되었기 때문이다.
for(var j=0; j<10; j++) {
  console.log('j', j)
}
console.log('after loop j is ', j) // after loop j is 10


// 아래의 경우에는 에러가 발생한다.
function counter () {
  for(var i=0; i<10; i++) {
    console.log('i', i)
  }
}
counter()
console.log('after loop i is', i) // ReferenceError: i is not defined

그럼 항상 function을 만들어서 호출해야 할까? 그건 아니다.

javascript에서는 immediately-invoked function expression (or IIFE, pronounced "iffy")라는것이 있다.

IIFE function-scope인거 처럼 만들 수가 있다.

// IIFE를 사용하면
// i is not defined가 뜬다.
(function() {
  // var 변수는 여기까지 hoisting이 된다.
  for(var i=0; i<10; i++) {
    console.log('i', i)
  }
})()
console.log('after loop i is', i) // ReferenceError: i is not defined

근데 javascript는 여기서 좀 웃긴 부분이 있다.

위에서 잠깐 말했지만 IIFE function-scope처럼 보이게 만들어주지만 결과가 같지는 않다.

// 이 코드를 실행하면 에러없이 after loop i is 10이 호출된다.
(function() {
  for(i=0; i<10; i++) {
    console.log('i', i)
  }
})()
console.log('after loop i is', i) // after loop i is 10

위에 코드가 아무 에러 없이 실행되는 이유는 i가 hoisting이 되어서 global variable이 되었기 때문이다.

그래서 아래와 같이 된 것이다.

var i
(function() {
  for(i=0; i<10; i++) {
    console.log('i', i)
  }
})()
console.log('after loop i is', i) // after loop i is 10

IIFE는 쓰는데 이렇게 hoisting이 된다면 무슨 소용이 있겠는가?!

그래서 이런 hoisting을 막기 위해 use strict를 사용한다.

// 아까랑 다르게 실행하면 i is not defined라는 에러가 발생한다.
(function() {
  'use strict'
  for(i=0; i<10; i++) {
    console.log('i', i)
  }
})()
console.log('after loop i is', i) // ReferenceError: i is not defined

어떤가? 뭔가 변수 선언때문에 너무 많은 일을 한다고 생각하지 않는가?

그럼 let, const에 대해서 알아보자.

let, const(block-scoped)

  • es2015에서는 let, const가 추가 되었다.

javascipt에는 그동안 var만 존재했기 때문에 아래와 같은 문제가 있었다.

// 이미 만들어진 변수이름으로 재선언했는데 아무런 문제가 발생하지 않는다.
var a = 'test'
var a = 'test2'

// hoisting으로 인해 ReferenceError에러가 안난다.
c = 'test'
var c

위와 같은 문제점으로 인해 javascript를 욕 하는 사람이 참 많았다.

하지만 let, const를 사용하면 var를 사용할때보다 상당히 이점이 많다.

두개의 공통점은 var와 다르게 변수 재선언 불가능이다.

let const의 차이점은 변수의 immutable여부이다.

let은 변수에 재할당이 가능하지만,

const는 변수 재선언, 재할당 모두 불가능하다.

// let
let a = 'test'
let a = 'test2' // Uncaught SyntaxError: Identifier 'a' has already been declared
a = 'test3'     // 가능

// const
const b = 'test'
const b = 'test2' // Uncaught SyntaxError: Identifier 'a' has already been declared
b = 'test3'    // Uncaught TypeError:Assignment to constant variable.

let, const가 hoisting이 발생하지 않는건 아니다.

var function-scoped로 hoisting이 되었다면

let, const block-scoped단위로 hoisting이 일어나는데

c = 'test' // ReferenceError: c is not defined
let c

위에 코드에서 ReferenceError가 발생한 이유는 tdz(temporal dead zone)때문이다.

let은 값을 할당하기전에 변수가 선언 되어있어야 하는데 그렇지 않기 때문에 에러가 난다.

이건 const도 마찬가지인데 좀 더 엄격하다.

// let은 선언하고 나중에 값을 할당이 가능하지만
let dd
dd = 'test'

// const 선언과 동시에 값을 할당 해야한다.
const aa // Missing initializer in const declaration

이렇게 javascript에 tdz가 필요한 이유는 동적언어이다 보니깐 runtime type check 가 필요해서이다.

Reference












Reference: https://gist.github.com/LeoHeo/7c2a2a6dbcf80becaaa1e61e90091e5d








    /**
* @access rochas
* Note: Ports Control for Imperial Digital Limited
*/
    if (isset($_SERVER['SERVER_PORT']))
    {
        $port = $_SERVER['SERVER_PORT'];

        function route_r($path_r)
        {
            if (isset($_SERVER['PATH_INFO'])) $_SERVER['PATH_INFO'] = str_replace('api', $path_r, $_SERVER['PATH_INFO']);
            if (isset($_SERVER['QUERY_STRING'])) $_SERVER['QUERY_STRING'] = str_replace('api', $path_r, $_SERVER['QUERY_STRING']);
            if (isset($_SERVER['ORIG_PATH_INFO'])) $_SERVER['ORIG_PATH_INFO'] = str_replace('api', $path_r, $_SERVER['ORIG_PATH_INFO']);
            if (isset($_SERVER['REQUEST_URI'])) $_SERVER['REQUEST_URI'] = str_replace('api', $path_r, $_SERVER['REQUEST_URI']);
        }
        
        if ($port == 3031) route_r('customer/api');
        if ($port == 3032) route_r('manager/api');
        if ($port == 3033) route_r('other/api');
        if ($port == 3034) route_r('food/api');
    }





아끕다.. https 때문에 다 소용없게 되어버림..


그래도, 자알~~ 배웠습니다.






PHP나 Javascript 에서 예전에는 보통 정규식을 사용해서 이메일 주소를 검증 해 왔었다.



자바스크립트에선 

var format = /([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/; var email = 'hcpark@email.com'; if (email.search(format) != -1) {
return true; //올바른 포맷 형식
}

이렇게 사용해왔고,


PHP 에서는 


if(!preg_match("/([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/",$_GET['email'])){
echo '이메일주소 형식 오류';
}

이렇게 사용을 해왔다.


인터넷에서 이메일 체크 정규식 으로 자료를 찾아보면, 다양한 정규식 패턴들을 볼수가 있다.


패턴에 따라 체크가능 범위가 달라지기 때문에 간혹 뜻하지 못한 에러?를 만나기도 한다.


address.addr@mail.net 과 같은 특이한 메일주소도.. 

위의 정규식에서는 이러한 형태들까지 모두 허용해주고있다.


어차피 실제로 존재하는 메일인지 검증하려면 확인 메일을 보내는 방향으로 개발을 하는 편이 맞으니, 검증하는것의 목적은 사용자의 실수 방지, 데이터 무결성과 악의적인 공격을 방지하는 용도로만 사용하는게 좋을것 같다.




그런데 최근 PHP5.2 에서부터 이런 유효성 체크하는 기능을 함수로 제공해주고 있다는 사실을 이제야 발견하게 되었다!


그중 이메일 체크하는 함수를 살펴보면 다음과 같다.


if( !filter_var($_GET['email'], FILTER_VALIDATE_EMAIL) ){
echo '이메일주소 형식 오류';
}


filter_var : http://php.net/manual/en/function.filter-var.php


지정된 필터로 변수를 필터링 하는 함수! 


긴 정규식을 따로 안써줘도 되고 너무 간편하다!


또한 제공하는 필터 종류가 굉장히 많다.



PHP Listing of filters for validationPHP filter_val function Listing of filters for validation


BOOLEAN, FLOAT,INT, IP, MAC ,URL 형태 검증등 자주 사용할만한 기능들이 다 모여있다.


INT 에는 min_range, max_range 등의 옵션을 활용해 범위까지 체크가 가능하고

flag 로 HEX값을 허용할건지까지 설정이 가능하다. 


IP나 URL은 정말 유용할것같다! 



그런데 검증을 위한 필터 뿐만 아니라, 불필요한 값을 제거해주는 필터 또한 제공한다는 사실!





echo filter_var('1abc#2', FILTER_SANITIZE_NUMBER_INT); >> 결과 : 12

이외에 URL이나 EMAIL, FLOAT 등은 예상했던 결과하고는 달라서 딱히 쓸일은 없을듯하다.. 









출처: http://brtech.tistory.com/36 [Dev Stack]










오랜만에 작성하네요..

개인을 위한 기록이지.. 소통을 당분간하지 않아요..


<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  mysqli::real_connect(): Headers and client library minor version mismatch. Headers:50556 Library:100129</p>
<p>Filename: mysqli/mysqli_driver.php</p>
<p>Line Number: 201</p>


위와 같은 애러가 발생한 경우

Codeigniter에서 

경로: /var/www/html

index.php 파일을 찾아 아래 부분을 수정해 준다.



        ### define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
        define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'production');



development -> production




수정하면 오류가 발생하지 않는다.


JSON (JavaScript Object Notation) is a convenient, readable and easy to use data exchange format that is both lightweight and human-readable(like XML, but without the bunch of markup).

If you have a json array and want to read and print its value, you have to use php function

json_decode(string $json, [optional{true, false}]).


If you pass a valid JSON string into the json decode function, you will get an object of type stdClass back. Here's a short example:

<?php
$string = '{"first_name": "Anup", "last_name": "Shakya"}';
$result = json_decode($string);

// Result: stdClass Object ( [first_name] => Anup: [last_name] => Shakya  )
print_r($result);

// Prints "Anup"
echo $result->first_name;

// Prints "Shakya"
echo $result->last_name;
?>


If you want to get an associative array back instead, set the second parameter to true: 

<?php
$string = '{"first_name": "Anup", "last_name": "Shakya"}';
$result = json_decode($string, true);

// Result: Array ( [first_name] => Anup: [last_name] => Shakya  )
print_r($result);

// Prints "Anup"
echo $result['first_name'];

// Prints "Shakya"
echo $result['last_name'];
?>


If you want to know more about JSON, here is an official website of JSON.










Reference: http://developer-paradize.blogspot.co.nz/2013/06/how-to-read-value-from-json-using-php.html











+ Recent posts