PHP ਸਰਵਰ ਸਾਈਡ 'ਤੇ ਬਹੁਤ ਸਾਰੇ ਦੁਹਰਾਉਣ ਵਾਲੇ ਕੰਮਾਂ ਨੂੰ ਸੰਭਾਲਦਾ ਹੈ। ਇੱਕ ਸਿੰਗਲ ਰਿਕੁਐਸਟ ਨੂੰ ਤਸਵੀਰਾਂ ਨਾਲ ਭਰੇ ਫੋਲਡਰ ਨੂੰ ਸਕੈਨ ਕਰਨ ਦੀ, ਸਟੇਟਸ ਬਦਲਣ ਤੱਕ ਡਾਟਾਬੇਸ ਨੂੰ ਪੋਲ (poll) ਕਰਨ ਦੀ, ਜਾਂ ਉਦੋਂ ਤੱਕ ਯੂਜ਼ਰ ਤੋਂ ਇਨਪੁਟ ਮੰਗਣ ਦੀ ਲੋੜ ਹੋ ਸਕਦੀ ਹੈ ਜਦੋਂ ਤੱਕ ਉਹ ਤੁਹਾਡੇ ਨਿਯਮਾਂ ਨੂੰ ਪੂਰਾ ਨਹੀਂ ਕਰਦਾ। ਉਸੇ ਕੋਡ ਬਲਾਕ ਨੂੰ ਕਾਪੀ ਅਤੇ ਪੇਸਟ ਕਰਕੇ ਇਹ ਸਭ ਕਰਨਾ ਕਮਜ਼ੋਰ ਹੋਵੇਗਾ ਅਤੇ ਇਸ ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਣਾ ਲਗਭਗ ਅਸੰਭਵ ਹੋਵੇਗਾ। ਲੂਪਸ (Loops) ਬਿਲਕੁਲ ਇਸੇ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ ਹੁੰਦੇ ਹਨ। ਉਹ ਲੌਜਿਕ ਨੂੰ ਇੱਕ ਮੁੜ ਵਰਤੋਂ ਯੋਗ ਬਲਾਕ ਵਿੱਚ ਲਪੇਟਦੇ ਹਨ, ਗਲਤੀਆਂ ਨੂੰ ਘਟਾਉਂਦੇ ਹਨ, ਅਤੇ ਤੁਹਾਡੀ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਸੰਖੇਪ ਰੱਖਦੇ ਹਨ।
ਜ਼ਿਆਦਾਤਰ PHP ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਜਦੋਂ ਪਤਾ ਹੁੰਦਾ ਹੈ ਕਿ ਉਹਨਾਂ ਨੂੰ ਕਿੰਨੇ ਇਟਰੇਸ਼ਨਾਂ (iterations) ਦੀ ਲੋੜ ਹੈ, ਤਾਂ ਉਹ instinctively for ਲੂਪ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਨ, ਜਾਂ ਜਦੋਂ ਗਿਣਤੀ ਕਿਸੇ ਡਾਇਨਾਮਿਕ ਕੰਡੀਸ਼ਨ 'ਤੇ ਨਿਰਭਰ ਕਰਦੀ ਹੈ, ਤਾਂ while ਲੂਪ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਨ। ਹਾਲਾਂਕਿ, ਇੱਕ ਤੀਜਾ ਵਿਕਲਪ ਵੀ ਹੈ, ਅਤੇ ਇਹ ਇੰਨਾ ਵੱਖਰਾ ਤਰੀਕੇ ਨਾਲ ਕੰਮ ਕਰਦਾ ਹੈ ਕਿ ਸਹੀ ਸਮੇਂ 'ਤੇ ਇਸ ਦੀ ਚੋਣ ਕਰਨ ਨਾਲ ਤੁਹਾਡਾ ਕੋਡ ਕਾਫ਼ੀ ਸਪਸ਼ਟ ਹੋ ਸਕਦਾ ਹੈ। do-while ਲੂਪ ਪਹਿਲਾਂ ਆਪਣੇ ਬਲਾਕ ਦੇ ਅੰਦਰਲੇ ਕੋਡ ਨੂੰ ਚਲਾਉਂਦਾ ਹੈ, ਫਿਰ ਚੈੱਕ ਕਰਦਾ ਹੈ ਕਿ ਕੀ ਇਸਨੂੰ ਦੁਬਾਰਾ ਚਲਾਉਣਾ ਚਾਹੀਦਾ ਹੈ।
do-while ਲੂਪ ਨੂੰ ਕੀ ਵੱਖਰਾ ਬਣਾਉਂਦਾ ਹੈ
ਇੱਕ ਸਟੈਂਡਰਡ while ਲੂਪ ਵਿੱਚ, PHP ਬਲਾਕ ਵਿੱਚ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਕੰਡੀਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰਦਾ ਹੈ। ਜੇਕਰ ਕੰਡੀਸ਼ਨ ਸ਼ੁਰੂ ਵਿੱਚ ਹੀ ਫਾਲਸ (false) ਹੋਵੇ, ਤਾਂ ਬਲਾਕ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਛੱਡ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ। ਇੱਕ do-while ਲੂਪ ਉਸ ਕ੍ਰਮ ਨੂੰ ਉਲਟਾ ਦਿੰਦਾ ਹੈ। ਇਹ ਕੋਡ ਨੂੰ ਇੱਕ ਵਾਰ ਚਲਾਉਂਦਾ ਹੈ, ਅੰਤ ਤੱਕ ਪਹੁੰਚਦਾ ਹੈ, ਅਤੇ ਫਿਰ ਹੀ ਇਹ ਫੈਸਲਾ ਲੈਣ ਲਈ ਕੰਡੀਸ਼ਨ ਚੈੱਕ ਕਰਦਾ ਹੈ ਕਿ ਕੀ ਲੂਪ ਵਾਪਸ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ।
ਸਿੰਟੈਕਸ (syntax) ਇਸ ਤਰ੍ਹਾਂ ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ:
do {
// statements
} while ($condition);
while ਕਲਾਜ਼ ਤੋਂ ਬਾਅਦ ਸੈਮੀਕੋਲਨ (semicolon) ਵੱਲ ਧਿਆਨ ਦਿਓ। ਉਹ ਸੈਮੀਕੋਲਨ ਜ਼ਰੂਰੀ ਹੈ, ਅਤੇ ਇਸ ਨੂੰ ਭੁੱਲਣ ਨਾਲ ਸਿੰਟੈਕਸ ਐਰਰ (syntax error) ਆਵੇਗਾ। do ਅਤੇ while ਦੇ ਵਿਚਕਾਰ ਵਾਲਾ ਬਲਾਕ ਹਮੇਸ਼ਾ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਵਾਰ ਚੱਲਦਾ ਹੈ, ਭਾਵੇਂ ਕੰਡੀਸ਼ਨ ਸ਼ੁਰੂ ਤੋਂ ਹੀ ਫਾਲਸ ਹੋਵੇ। ਇਹ ਪੋਸਟ-ਟੈਸਟ (post-test) ਵਿਵਹਾਰ ਸਿਰਫ਼ ਇੱਕ ਅਜੀਬ ਗੱਲ ਨਹੀਂ ਹੈ; ਇਹ ਉਹ ਮੁੱਖ ਕਾਰਨ ਹੈ ਜਿਸ ਕਰਕੇ ਇਹ ਲੂਪ ਮੌਜੂਦ ਹੈ।
do-while ਦੀ ਵਰਤੋਂ ਕਦੋਂ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ
ਤਿੰਨ ਆਮ ਸਥਿਤੀਆਂ ਹਨ ਜਿੱਥੇ ਇਹ ਢਾਂਚਾ ਬਹੁਤ ਵਧੀਆ ਕੰਮ ਕਰਦਾ ਹੈ: ਮੀਨੂ ਦਿਖਾਉਣਾ, ਇਨਪੁਟ ਨੂੰ ਵੈਲੀਡੇਟ (validate) ਕਰਨਾ, ਅਤੇ ਕਿਸੇ ਅਜਿਹੇ ਕੰਮ ਨੂੰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨਾ ਜੋ ਅਸਫਲ ਹੋ ਸਕਦਾ ਹੈ। ਹਰੇਕ ਮਾਮਲੇ ਵਿੱਚ, ਲੌਜਿਕ ਇਹ ਮੰਗ ਕਰਦਾ ਹੈ ਕਿ ਜਾਰੀ ਰੱਖਣਾ ਹੈ ਜਾਂ ਨਹੀਂ, ਇਸ ਦਾ ਫੈਸਲਾ ਲੈਣ ਤੋਂ ਪਹਿਲਾਂ ਕਾਰਵਾਈ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ।
ਮੀਨੂ ਦਿਖਾਉਣਾ
ਇੱਕ ਕਮਾਂਡ-ਲਾਈਨ ਟੂਲ ਜਾਂ ਟੈਕਸਟ-ਅਧਾਰਤ ਐਡਮਿਨ ਪੈਨਲ ਦੀ ਕਲਪਨਾ ਕਰੋ। ਤੁਹਾਨੂੰ ਵਿਕਲਪਾਂ ਦੀ ਇੱਕ ਸੂਚੀ ਪ੍ਰਿੰਟ ਕਰਨੀ ਪੈਂਦੀ ਹੈ, ਯੂਜ਼ਰ ਦੁਆਰਾ ਇੱਕ ਚੁਣਨ ਦੀ ਉਡੀਕ ਕਰਨੀ ਪੈਂਦੀ ਹੈ, ਅਤੇ ਫਿਰ ਇਹ ਫੈਸਲਾ ਲੈਣਾ ਪੈਂਦਾ ਹੈ ਕਿ ਕੀ ਮੀਨੂ ਨੂੰ ਦੁਬਾਰਾ ਦਿਖਾਉਣਾ ਹੈ। ਜਦੋਂ ਤੱਕ ਮੀਨੂ ਸਕ੍ਰੀਨ 'ਤੇ ਨਹੀਂ ਆ ਜਾਂਦਾ, ਤੁਸੀਂ ਇਹ ਚੈੱਕ ਨਹੀਂ ਕਰ ਸਕਦੇ ਕਿ ਯੂਜ਼ਰ ਨੇ ਐਗਜ਼ਿਟ (exit) ਚੁਣਿਆ ਹੈ ਜਾਂ ਨਹੀਂ।
$choice = 0;
do {
echo "1. View Reports\n";
echo "2. Export Data\n";
echo "3. Exit\n";
$choice = (int) readline("Select an option: ");
if ($choice === 1) {
// fetch and display reports
} elseif ($choice === 2) {
// run export logic
}
} while ($choice !== 3);
ਇੱਕ ਰੈਗੂਲਰ while ਲੂਪ ਤਕਨੀਕੀ ਤੌਰ 'ਤੇ ਇਸਨੂੰ ਸੰਭਾਲ ਸਕਦਾ ਹੈ, ਪਰ ਇਹ ਤੁਹਾਨੂੰ ਲੂਪ ਸ਼ੁਰੂ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ ਇੱਕ ਵਾਰ ਮੀਨੂ ਆਉਟਪੁੱਟ ਨੂੰ ਦੁਹਰਾਉਣ ਲਈ ਮਜਬੂ
ਕਿਉਂਕਿ do-while ਲੂਪ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਵਾਰ ਚੱਲਣ ਦੀ ਗਾਰੰਟੀ ਦਿੰਦਾ ਹੈ, ਜੇਕਰ ਤੁਸੀਂ ਸਾਵਧਾਨ ਨਹੀਂ ਹੋ, ਤਾਂ ਇਹ ਇੱਕ ਅਨੰਤ (infinite) ਲੂਪ ਵੀ ਬਣਾ ਸਕਦਾ ਹੈ। ਜੇਕਰ ਕੰਡੀਸ਼ਨ ਵਿੱਚ ਚੈੱਕ ਕੀਤੇ ਜਾਣ ਵਾਲੇ ਵੇਰੀਏਬਲ ਬਲਾਕ ਦੇ ਅੰਦਰ ਕਦੇ ਨਹੀਂ ਬਦਲਦੇ, ਤਾਂ PHP ਹਮੇਸ਼ਾ ਲਈ ਚਲਦਾ ਰਹੇਗਾ ਜਾਂ ਜਦੋਂ ਤੱਕ ਇਹ ਮੈਕਸੀਮਮ ਐਗਜ਼ੀਕਿਊਸ਼ਨ ਟਾਈਮ (maximum execution time) ਤੱਕ ਨਹੀਂ ਪਹੁੰਚ ਜਾਂਦਾ।
ਇੱਕ ਹੋਰ ਆਮ ਗਲਤੀ ਅਖੀਰ ਵਿੱਚ ਸੈਮੀਕੋਲਨ (semicolon) ਲਗਾਉਣਾ ਭੁੱਲ ਜਾਣਾ ਹੈ। ਹੇਠਾਂ ਦਿੱਤਾ ਉਦਾਹਰਨ ਫੇਲ ਹੋ ਜਾਵੇਗਾ:
do {
// code
} while ($x < 5) // syntax error
ਤੁਹਾਨੂੰ ਆਦਤ ਦੇ ਮਗਰ ਪੈ ਕੇ do-while ਦੀ ਵਰਤੋਂ ਕਰਨ ਤੋਂ ਬਚਣਾ ਚਾਹੀਦਾ ਹੈ ਜਦੋਂ ਕੋਈ ਹੋਰ ਲੂਪ ਵਧੇਰੇ ਸਪਸ਼ਟ ਹੋਵੇ। ਜੇਕਰ ਤੁਸੀਂ ਕਿਸੇ ਐਰੇ (array) ਉੱਤੇ ਇਟਰੇਟ (iterate) ਕਰ ਰਹੇ ਹੋ, ਤਾਂ foreach ਲਗਭਗ ਹਮੇਸ਼ਾ ਬਿਹਤਰ ਹੁੰਦਾ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਇੱਕ ਸਧਾਰਨ ਨੰਬਰ ਕਾਊਂਟਰ (numeric counter) ਨੂੰ ਮੈਨੇਜ ਕਰ ਰਹੇ ਹੋ, ਤਾਂ for ਲੂਪ ਇਨੀਸ਼ੀਅਲਾਈਜ਼ੇਸ਼ਨ (initialization), ਕੰਡੀਸ਼ਨ ਅਤੇ ਇੰਕਰੀਮੈਂਟ (increment) ਨੂੰ ਇੱਕ ਹੀ ਲਾਈਨ ਵਿੱਚ ਰੱਖਦਾ ਹੈ, ਜਿਸ ਨੂੰ ਪੜ੍ਹਨਾ ਆਸਾਨ ਹੁੰਦਾ ਹੈ।
ਪਰਫਾਰਮੈਂਸ ਦੇ ਮਾਮਲੇ ਵਿੱਚ, PHP ਵਿੱਚ while ਦੇ ਮੁਕਾਬਲੇ do-while ਵਿੱਚ ਕੋਈ ਖਾਸ ਵਾਧੂ ਬੋਝ (overhead) ਨਹੀਂ ਹੁੰਦਾ। ਇਸਦਾ ਫਾਇਦਾ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸੰਰਚਨਾਤਮਕ (structural) ਹੈ। ਜਦੋਂ ਕੋਈ ਹੋਰ ਡਿਵੈਲਪਰ do-while ਲੂਪ ਦੇਖਦਾ ਹੈ, ਤਾਂ ਉਹ ਤੁਰੰਤ ਸਮਝ ਜਾਂਦਾ ਹੈ ਕਿ ਕਿਸੇ ਵੀ ਕੰਡੀਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਬਲਾਕ ਨੂੰ ਚੱਲਣਾ ਹੀ ਚਾਹੀਦਾ ਹੈ। ਇਹ ਇੱਕ ਜਾਣਕਾਰੀ ਉਹਨਾਂ ਨੂੰ ਡਮੀ ਵੇਰੀਏਬਲਜ਼ ਨੂੰ ਟਰੇਸ ਕਰਨ ਜਾਂ ਇੱਕ ਸਟੈਂਡਰਡ while ਲੂਪ ਦੇ ਉੱਪਰ ਦੁਹਰਾਏ ਗਏ ਸੈੱਟਅੱਪ ਕੋਡ ਤੋਂ ਬਚਾਉਂਦੀ ਹੈ।
ਐਜ ਕੇਸਿਸ (Edge Cases) ਅਤੇ ਵਿਕਲਪਿਕ ਪੈਟਰਨਾਂ
ਕਈ ਵਾਰ do-while ਲੂਪ ਉਦੋਂ ਵੀ ਉਪਯੋਗੀ ਹੁੰਦਾ ਹੈ ਜਦੋਂ ਕੋਈ ਯੂਜ਼ਰ ਇੰਟਰੈਕਸ਼ਨ (user interaction) ਸ਼ਾਮਲ ਨਹੀਂ ਹੁੰਦੀ। ਉਦਾਹਰਨ ਲਈ, ਜਦੋਂ ਕਿਸੇ ਜਨਰੇਟਰ (generator) ਜਾਂ ਕਰਸਰ (cursor) ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾ ਰਹੀ ਹੋਵੇ ਜੋ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਆਈਟਮ ਦਿੰਦਾ ਹੈ, ਤਾਂ ਤੁਸੀਂ ਪਹਿਲੀ ਆਈਟਮ ਨੂੰ ਪ੍ਰੋਸੈਸ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਫਿਰ ਚੈੱਕ ਕਰ ਸਕਦੇ ਹੋ ਕਿ ਕੀ ਕਰਸਰ ਅਗਲੀ ਸਹੀ ਪੁਜੀਸ਼ਨ 'ਤੇ ਪਹੁੰਚ ਗਿਆ ਹੈ। ਲੇਗਸੀ ਕੋਡਬੇਸ (legacy codebases) ਵਿੱਚ ਜੋ ਮਾਡਰਨ ਰਿਜ਼ਲਟ ਸੈੱਟਸ ਦੀ ਬਜਾਏ ਰਅਅ ਡੇਟਾਬੇਸ ਰਿਸੋਰਸਾਂ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਨ, ਉੱਥੇ ਤੁਹਾਨੂੰ ਇਸ ਤਰ੍ਹਾਂ ਦਾ ਪੈਟਰਨ ਦਿਖਾਈ ਦੇ ਸਕਦਾ ਹੈ:
$row = $result->fetch();
do {
// process $row
} while ($row = $result->fetch());
ਹਾਲਾਂਕਿ ਮਾਡਰਨ PHP ਵਿੱਚ PDO ਦੇ ਨਾਲ foreach ਨੂੰ ਤਰਜੀਹ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ, ਪਰ ਇਹ ਪੈਟਰਨ ਦਰਸਾਉਂਦਾ ਹੈ ਕਿ ਕਿਵੇਂ do-while ਬਿਨਾਂ ਕਿਸੇ ਵਾਧੂ ਬ੍ਰਾਂਚਿੰਗ (branching) ਦੇ ਪਹਿਲੀ ਇਟਰੇਸ਼ਨ (iteration) ਨੂੰ ਇੱਕ ਵਿਸ਼ੇਸ਼ ਕੇਸ ਵਜੋਂ ਸੰਭਾਲਦਾ ਹੈ।
ਅਸਲ ਸਿੱਖਿਆ (The Real Takeaway)
do-while ਲੂਪ ਇੱਕ ਸੀਮਤ ਸੰਦ ਹੈ, ਪਰ ਸਹੀ ਜਗ੍ਹਾ 'ਤੇ ਇਹ ਇਕਲੌਤਾ ਅਜਿਹਾ ਸੰਦ ਹੈ ਜੋ ਤਰਕਸੰਗਤ ਹੈ। ਇਹ ਤੁਹਾਡੇ ਸੈੱਟਅੱਪ ਅਤੇ ਵੈਲੀਡੇਸ਼ਨ ਲੌਜਿਕ (validation logic) ਨੂੰ ਇੱਕੋ ਜਗ੍ਹਾ ਰੱਖਦਾ ਹੈ, ਇਹ ਗਾਰੰਟੀ ਦਿੰਦਾ ਹੈ ਕਿ ਕਿਸੇ ਕਾਰਵਾਈ ਨੂੰ ਜੱਜ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਗਈ ਹੈ, ਅਤੇ ਤੁਹਾਡੇ ਇਰਾਦੇ ਨੂੰ ਕੋਡ ਪੜ੍ਹਨ ਵਾਲੇ ਅਗਲੇ ਵਿਅਕਤੀ ਤੱਕ ਸਿੱਧੇ ਤਰੀਕੇ ਨਾਲ ਪਹੁੰਚਾਉਂਦਾ ਹੈ। ਜਦੋਂ ਕੰਮ ਕਰਨ ਤੋਂ ਬਾਅਦ ਕੰਡੀਸ਼ਨ ਆਉਣੀ ਚਾਹੀਦੀ ਹੋਵੇ, ਤਾਂ do-while ਦੀ ਵਰਤੋਂ ਕਰੋ। ਬਾਕੀ ਹਰ ਮਾਮਲੇ ਵਿੱਚ, ਸਧਾਰਨ while, for, ਜਾਂ foreach ਨੂੰ ਆਪਣਾ ਕੰਮ ਕਰਨ ਦਿਓ।
